2017-03-22 8 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); 
} 

にテンプレートからカテゴリーをコピーしようとしている。しかし、それは私のカテゴリテーブル内の2つのカテゴリを上書きするのコードです。クライアントに保存しますが、テンプレートから削除します。

ご協力いただければ幸いです! ありがとうございます。

答えて

0

これは意味があります。 Categoryモデルのテーブルには2つの列があり、1つはモデルのタイプ、もう1つはid(おそらく何かがcategorisable_type(App \ Models \ Templateのようなもの))とcategorisable_id "4"のようなものになります))。

したがって、既存のカテゴリを再割り当てするたびに、これらの2つの列がテンプレートモデルからクライアントモデルに書き換えられます(たとえば、App¥Models¥Clientおよび6などに変更されます)。

現在地いくつかのオプションがあります。

1)あなたの関係タイプは、実際に理想的ではありません。ここでは単純なone2manyを使用することができます。いくつかのカテゴリーを作成し、テンプレートとクライアントモデルにcategory_idを付けます。これにより、テンプレートとクライアントの両方で同じカテゴリを使用できるようになります。

2)各テンプレートまたはクライアントに複数のカテゴリが必要な場合は、many2many relationshipを使用します。他のオプションはオプション1と似ていますが、とcategory_templateのような2つのテーブルがあります.Laravel命名規則に従うと仮定していますが、実際には何も使用できますが、関係メソッドで指定するだけです。

3)many2many多相関係を使用することもできます。あなたはclientstemplatescategories、およびcategorisableテーブルで終わるでしょう。 categoriesテーブルはカテゴリーを保持するだけで、categorisableはオプション2と同様の関係定義を持ちます。

4)ここで1つの多型関係を使用することをアドバイスしている場合(アドバイス:しないでください)、割り当てるすべてのクライアントごとに各テンプレートをクローンできますが、それは意味をなさないので実際にはありません同じカテゴリーがTemplateまたはClientに添付されているため、元のクローンのみであるため、異なるカテゴリに属しているためtemplatesまたはclientCategoryから複数のアクセスを逆転することはできません。

メソッド1と2は、現在のロジックが逆転し、前述のように理想的でないため、実際には正しい順序でリレーションシップ全体を逆転します。

さらに詳しい情報はこちら - https://laravel.com/docs/5.4/eloquent-relationships(これは私がこれを書いている時点での最新リリースのLaravel 5.4です)。

関連する問題