Laravel-多对多多态关系

时间:2018-10-18 15:24:16

标签: laravel-5 eloquent polymorphism many-to-many relationship

我要反对Laravel 5.7中的多态关系定义

以下是数据情况: 我有一个用户模型,一个产品模型和一个商品模型 我基本上想为我的用户建立一个愿望清单,它既可以包含商品,也可以包含产品,并且我希望在那里具有多态关系,因为以后我将不得不添加新的商品类型来出售。

在我(简化的)当前数据模式中,我有

users
-email
-id

products
-id
-name

merchandises
-id
-name

臭名昭著的人

wish_list_items
-user_id
-wish_list_item_type
-wish_list_id

关于关系(在用户方面):

public function wishListProducts()
{
    return $this->morphedByMany(Product::class, 'wish_list_items');
}

public function wishListMerchandises()
{
    return $this->morphedByMany(Merchandise::class, 'wish_list_items');
}

现在这很好用。但是,对于我想要实现的目标来说,这还远远不够-我所缺少的是获取“愿望清单”中所有项目(无论其类型如何)的步骤。目前:

public function wishListAll()
{
    return $this->load(['wishListProducts','wishListMerchandises']);
}

显然可以给我一份所有物品的清单,但要放在分开的收藏夹中-我想要一个统一的收藏夹。

第一个问题,是否有一种方法可以获取与该用户相关联的所有信息,而无论其类型如何?这可能很简单,但我在任何地方都找不到。

如果这是不可能的(我实际上怀疑-但这意味着这些多态关系不只是一种避免创建另一个数据透视表的方式,我不介意这样做),人们会怎么想呢?最好的进行方式? 最初的想法是创建一个接口,我的所有可售商品模型都将实现该接口,以统一所有内容,尽管如此,我仍然必须遍历所有分离的集合,除非有一种简单的方法可以将它们合并,因为它们实现相同接口? 还是我应该为WishListItems定义一个模型(目前是数据透视表,因此尚未定义模型),让我所有的可售商品模型扩展超级模型,并尝试将关系链接在一起?

感谢您的输入!

1 个答案:

答案 0 :(得分:2)

您不能使用该关系一次获取所有项目。

“默认”解决方案是合并两个(或更多)集合的访问器:

public function getWishListItemsAttribute()
{
    return $this->wishListProducts->toBase()->merge($this->wishListMerchandises);
}

// $user->wishListItems