Laravel - 多对多多态关系

2024-03-28

我正在努力反对 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 定义一个模型(目前它是一个数据透视表,因此模型尚未定义),使我的所有可销售模型扩展超级模型,并尝试将关系链接在一起?

感谢您的投入!


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

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

// $user->wishListItems

+++ 更新 +++

我创建了一个使用视图合并关系的包:
https://github.com/staudenmeir/laravel-merged-relations https://github.com/staudenmeir/laravel-merged-relations

首先,在迁移中创建合并视图:

use Staudenmeir\LaravelMergedRelations\Facades\Schema;

Schema::createMergeView(
    'wish_list_items', [(new User)->wishListMerchandises(), (new User)->wishListProducts()]
);

然后定义关系:

class User extends Model
{
    use \Staudenmeir\LaravelMergedRelations\Eloquent\HasMergedRelationships;

    public function wishListItems()
    {
        return $this->mergedRelation('wish_list_items');
    }
}

像任何其他关系一样使用它:

$user->wishListItems;

$user->wishListItems()->paginate();

User::with('wishListItems')->get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel - 多对多多态关系 的相关文章

随机推荐