假设我有一个帖子和用户模型,我想像这样管理它们之间的关系:
惯例是创建一个名为post_user的透视表,但在本例中,我们有两个透视表,所以我是为每个关系创建两个表,还是有办法将两个关系放在同一个表中。我也想尽可能地遵循Laravel的惯例,所以将pivot命名为post_user以外的东西听起来是个坏主意。我显然不能让两个表都具有相同的名称,所以这是不可能的
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 ]);
型
hwazgwia2#
是的,您可以在同一个表中实现这两种关系。当您创建透视表post_user时,您可以添加一个type列来指示关系类型。Post Model将是
post_user
type
public function users() { return $this->belongsToMany(User::class, 'post_user') ->wherePivot('type', 'bookmark') ->withTimestamps(); }
个字符这里你使用了一个pivot表,但是根据类型列的值区分了"书签"和"喜欢",同时也保持了Laravel的约定,但是这也可以用两个pivot表来完成。这取决于你想如何处理它。
2条答案
按热度按时间eqqqjvef1#
你不必创建两个表,在laravel约定中,你可以在pivot表中添加更多列,下面是一个例子:在Post模型中:
字符串
在用户模型中:
型
然后你可以像下面这样填充它:
型
hwazgwia2#
是的,您可以在同一个表中实现这两种关系。当您创建透视表
post_user
时,您可以添加一个type
列来指示关系类型。Post Model将是个字符
这里你使用了一个pivot表,但是根据类型列的值区分了"书签"和"喜欢",同时也保持了Laravel的约定,但是这也可以用两个pivot表来完成。这取决于你想如何处理它。