2017-03-22 3 views
2

범주에 다형성 관계가 있으며 클라이언트 또는 템플릿에 속할 수 있습니다.Laravel 저장시 다형성 관계 덮어 쓰기

템플릿을 클라이언트에 할당하려고합니다. 하지만 내 템플릿 카테고리를 덮어 쓰고 있습니다.

분류 모델

class Category extends Model 
{ 

    public function categorisable() 
    { 
     return $this->morphTo(); 
    } 
} 

클라이언트 모델

class Client extends Model 
{ 
    public function categories() 
    { 
     return $this->morphMany(Category::class, 'categorisable'); 
    } 
} 

템플릿 모델

class Template extends Model 
{ 
    public function categories() 
    { 
     return $this->morphMany(Category::class, 'categorisable'); 
    } 
} 

이것은 내가 클라이언트

$template = Template::find($request->get('template_id')); 
$client = Client::find($request->get('client_id')); 

// For this template, get all categories 
foreach($template->categories as $category) { 
    $client->categories()->save($category); 
} 

에 템플릿에서 카테고리를 복사하기 위해 노력하고있어하지만 그것은 내 카테고리 테이블에서이 개 범주를 덮어 쓰는 것 코드입니다. 따라서 클라이언트에 저장하고 템플릿에서 제거하십시오.

도움이 될 것입니다. 감사합니다.

답변

0

의미가 있습니다. Category 모델에 대한 테이블에는 두 개의 열이 있습니다. 하나는 모델의 유형이고 다른 하나는 id (아마도 App34 \ Models \ Template와 같은 형태의 categorisable_type)이고 "4"와 같은 것이 될 것입니다)).

따라서 기존 범주를 다시 할당 할 때마다 템플릿 모델에서 클라이언트 모델로이 두 열을 다시 씁니다 (예 : "App \ Models \ Client"및 "6"과 같이 변경).

당신은 여기에 몇 가지 옵션이 있습니다 :

1) 관계 유형이 실제로 적합하지 않습니다. 여기에 간단한 one2many를 사용할 수 있습니다. 여러 가지 카테터를 작성한 다음 템플릿 및 클라이언트 모델에 category_id를 지정하십시오. 이렇게하면 템플릿과 클라이언트 모두에서 동일한 카테고리를 사용할 수 있습니다.

2) 각 템플릿 또는 클라이언트에 여러 범주를 첨부해야하는 경우 many2many relationship을 사용하십시오. 나머지는 옵션 1과 비슷하지만, Laravel 명명 규칙을 따르는 것으로 가정하면 category_clientcategory_template과 같은 두 개의 테이블이 더 있습니다.하지만 실제로 사용할 수있는 것은 관계 메소드에서 지정해야합니다.

3) many2many 다형성 관계를 사용할 수도 있습니다. 당신은 clients, templates, categoriescategorisable 테이블로 끝날 것입니다. categories 테이블은 범주를 보유 할 것이며, categorisable은 옵션 2와 비슷한 관계 정의를 갖습니다.

4) 당신이 여기에 하나 이상의 2 다형성 관계를 사용하도록 주장한다면 (조언은하지 말라), 할당하려는 모든 클라이언트에 대해 각각의 템플릿을 복제 할 수는 있지만 그것이 의미가 없으므로 실제로 가지지 않을 것입니다 동일한 카테고리가 Template 또는 Client에 첨부되어 있기 때문에 원래의 복제본이므로 Category에서 복수 templates 또는 client을 모두 역방향으로 액세스 할 수 없습니다. 둘 다 다른 카테고리에 속하기 때문입니다.

방법 1과 2는 현재 논리가 반전되고 언급 한대로 이상적이지 않기 때문에 실제로 올바른 순서로 전체 관계를 역전시킵니다.

자세한 내용은 여기 - https://laravel.com/docs/5.4/eloquent-relationships (Laravel 5.4의 경우이 글을 쓰고있는 시점의 최신 릴리스 임).