多列枢轴雄辩的关系

时间:2018-04-11 13:19:18

标签: php laravel eloquent

背景:相关应用程序允许用户从可用标记列表中应用标记。一篇文章可以有许多标签,每个标签可能属于许多文章。这些之间的关系很好,但复杂性在于用户应该只看到他们应用于文章的标签。例如,如果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 |

1 个答案:

答案 0 :(得分:1)

您只需要一个数据透视表(它也不需要id):

article_tag_user: article_id | tag_id | user_id

然后,BelongsToManyArticleTag的所有组合之间都有User个关系。

相关问题