如何在laravel中存储多个多对多关系?

j0pj023g  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(169)

假设我有一个帖子和用户模型,我想像这样管理它们之间的关系:

  • 书签(一篇文章可以被许多用户收藏,反之亦然)
  • 喜欢(与书签相同的想法)

惯例是创建一个名为post_user的透视表,但在本例中,我们有两个透视表,所以我是为每个关系创建两个表,还是有办法将两个关系放在同一个表中。
我也想尽可能地遵循Laravel的惯例,所以将pivot命名为post_user以外的东西听起来是个坏主意。
我显然不能让两个表都具有相同的名称,所以这是不可能的

eqqqjvef

eqqqjvef1#

你不必创建两个表,在laravel约定中,你可以在pivot表中添加更多列,下面是一个例子:在Post模型中:

public function users()
{
    return $this->belongsToMany(User::class, 'post_user')
        ->withPivot([
            'liked'
        ])->using(PostUser::class);
}

字符串
在用户模型中:

public function posts()
{
    return $this->belongsToMany(Post::class, 'post_user')
        ->withPivot([
            'liked',
        ])->using(PostUser::class);
}


然后你可以像下面这样填充它:

$user->posts()->attach($post, [
    'liked' => true, // false
]);
// OR
$post->users()->attach($user, [
    'liked' => true, // false
]);

hwazgwia

hwazgwia2#

是的,您可以在同一个表中实现这两种关系。当您创建透视表post_user时,您可以添加一个type列来指示关系类型。Post Model将是

public function users() {
    return $this->belongsToMany(User::class, 'post_user')
        ->wherePivot('type', 'bookmark')
        ->withTimestamps();
}

个字符
这里你使用了一个pivot表,但是根据类型列的值区分了"书签"和"喜欢",同时也保持了Laravel的约定,但是这也可以用两个pivot表来完成。这取决于你想如何处理它。

相关问题