背景:相关应用程序允许用户从可用标记列表中应用标记。一篇文章可以有许多标签,每个标签可能属于许多文章。这些之间的关系很好,但复杂性在于用户应该只看到他们应用于文章的标签。例如,如果Alice将#' Apple',' Banana' Cherry']应用于文章#1,Alice就不应该看到Bob的文章# 1个标签[' Grape',' Orange',' Kiwi']。
理想:通过在中间数据透视表中创建记录,Auth用户可以访问标记并将其应用于文章。此外,如果用户已应用了尚不存在的标记,则他们应该能够在同一操作中插入新标记。
此操作实际上与标记应用于StackOverflow帖子的方式类似。
我目前正在使用的代码,但几乎没有,所以我想看看其他人如何组织这些代码之间的关系。如果存在可以处理此逻辑的包,我也可以使用包。
关系:
class User extends Authenticatable
{
public function articles()
{
return $this->hasMany('\App\Article');
}
public function articles_tags()
{
return $this->belongsToMany('\App\Article_Tag', 'article_tag_user', 'article_tag_id','user_id');
}
}
class Article extends Model
{
public function tags()
{
return $this->belongsToMany('\App\Tag', 'article_tag');
}
public function user()
{
return $this->belongsTo('\App\User', 'user_id');
}
public function article_tag_user()
{
return $this->hasManyThrough('\App\Tag', '\App\Article_Tag_User', 'article_id', 'id', 'article_id', 'tag_id');
}
}
class Tag extends Model
{
protected $fillable = [
'name'
];
public function user()
{
return $this->belongsToMany('\App\User', 'article_tag_user', 'id', 'article_tag_id');
}
public function articles()
{
return $this->belongsToMany('\App\Article', 'article_tag');
}
}
class Article_Tag extends Model
{
protected $table = 'article_tag';
public function user()
{
return $this->belongsToMany('\App\User', 'article_tag_user', 'user_id', 'article_tag_id');
}
public function tags()
{
return $this->belongsTo('\App\Tag');
}
}
class Article_Tag_User extends Model
{
protected $table = 'article_tag_user';
public function tags()
{
return $this->hasManyThrough('\App\Tag', '\App\Article_Tag');
}
}
表架构
标记表
| ID |名称|
Article_Tag表
| ID |的article_id | TAG_ID |
Article_Tag_User
| ID | USER_ID | article_tag_id |
答案 0 :(得分:1)
您只需要一个数据透视表(它也不需要id
):
article_tag_user: article_id | tag_id | user_id
然后,BelongsToMany
,Article
,Tag
的所有组合之间都有User
个关系。