你如何在 Laravel 4 中插入相关的多态模型

Posted

技术标签:

【中文标题】你如何在 Laravel 4 中插入相关的多态模型【英文标题】:How do you insert related polymorphic models in Laravel 4 【发布时间】:2014-08-29 19:00:53 【问题描述】:

在 Laravel 4 中,我有一个“元”模型,它可以通过“object_id”和“object_type”属性关联到任何对象。例如:

id: 1
object_id: 100
object_type: User
key: favorite_ice_cream
value: Vanilla

我通过 morphTo() 和 morphMany() 可以正常工作,如http://laravel.com/docs/eloquent#polymorphic-relations 中所述,因此我可以通过以下方式拉取用户及其所有元数据:

$user = User::with('meta')->find(100);

我现在想弄清楚的是:有没有一种简单的方法可以将元数据保存给我的用户?如:

$user = User::find(100);
$user->meta()->save(['key' => 'hair_color', 'value' = 'black']);

无论保存什么,都需要在元数据上正确设置 object_id 和 object_type。由于我已经在模型中定义了关系,我不确定这是否会自动完成。我随机尝试了几种不同的方法,但每次都崩溃。

【问题讨论】:

MorphMany 上的 save 方法将相关模型作为参数,而不是数组。而且“坠毁”没有任何意义,所以要准确 如果我创建一个元模型数组并将其传递给 saveMany(),saveMany 会自动设置 object_id 和 object_type 属性吗?还是在创建 Meta 对象时必须手动执行此操作?我希望,因为我已经定义了 Meta 和 User 之间的关系,并且它知道如何从 User 中检索 Meta,所以有一种方法可以将 Meta 放回 User 中,而无需手动设置 $meta- >object_type = 'User' 在执行 $user->meta()->save($meta) 之前。有意义吗? 你的意思是$user->meta()->attach(1, ['key' => 'hair_color', 'value' => 'black']) 没有达到你所需要的吗? 当然会正确设置关系,所以不需要手动设置_type_id中的任何一个 @deczo 好的,这是有道理的。谢谢! 【参考方案1】:

MorphMany 上的save 方法将相关模型作为参数,而不是数组。

它将始终正确设置多态关系的外键和模型类型。显然你需要先保存父模型。

// Meta morphTo(User)
$user = User::find($id);

$meta = new Meta([...]);
$user->meta()->save($meta);

// or multiple
$user->meta()->saveMany([new Meta([...], new Meta[...]);
另一方面,

attach 是适用于 belongsToMany 和 mm 多态关系的不同方法,它确实做同样的事情,但这些关系也使用 save

// User belongsToMany(Category)
$user = User::find($id);
$user->categories()->save(new Category([...]));

// but attach is different
$user->categories()->attach($catId); // either id

$category = Category::find($catId);
$user->categories()->attach($category); // or a Model

// this will not work
$user->categories()->attach(new Category([...]));

【讨论】:

以上是关于你如何在 Laravel 4 中插入相关的多态模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 渴望加载多态关系的相关模型

如何最好地链接到 Laravel 中的多态关系

如何在 Laravel 4 中选择相关模型计数为 0 的模型?

laravel的多态关联--morphTo和morphMany

如何在laravel中获得多态关系?

Laravel 5 具有多态关系的只读视图模型