【问题标题】:Laravel: One to many and many to many relationship on one modelLaravel:一个模型上的一对多和多对多关系
【发布时间】:2017-05-07 16:05:56
【问题描述】:

假设我们有两个基于我们的表的模型(Post 和 Tag)

帖子有一个(一对多)关系,有一个所谓的突出显示标签字段,它只接受一个标签。

帖子还具有(多对多)关系,可以为该帖子分配标签,所以它就像普通标签一样。

据我了解,您不能将多个关系分配给同一个表,使用 Laravel 怎么可能?最佳做法是什么?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    如果我理解正确,您希望帖子有一个主要(突出显示的标签)标签和多个普通标签。这很容易。

    您的帖子模型功能:

    public function tag()
    {
        //Your highlighted tag
        return $this->belongsTo(Tag::class);
    }
    
    public function tags()
    {
        //All normal tags
        return $this->hasMany(Tag::class);
    }
    

    这些是您的表格的列:

    posts表:

    id: int
    title: string
    content: string
    tag_id: int
    

    tags表:

    id: int
    name: string
    post_id: int
    

    【讨论】:

    • 不幸的是,这不起作用,我们首先需要多对多关系才能拥有标签。一对多行不通。同样在答案中,我们是简短的 1 个数据库字段,我们将突出显示的标签 id 放在哪里!?
    【解决方案2】:
    You can do following : 
    
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
    
        public function tags(){
    
            return $this->hasMany('App\Tag');
        }
    
        public function highlightedtag(){
    
            return $this->tags->where('tag_type', 'highlighted')->first();
        }
    
    }
    
    ?>
    
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Tag extends Model
    {
    
        public function posts(){
    
            return $this->hasMany('App\Post');
        }
    
    }
    
    ?>
    

    【讨论】:

    • 要拥有标签,您需要具有多对多关系,一对多根本不起作用,而且在答案中,您没有考虑其他具有相同突出显示标签的帖子。
    猜你喜欢
    • 2016-02-21
    • 2016-07-12
    • 2018-06-16
    • 2016-05-25
    • 2016-03-02
    • 1970-01-01
    • 2018-09-27
    • 2018-06-15
    相关资源
    最近更新 更多