在Laravel中,如何为“喜欢”表建立关系?另外,如何在查询中包含该信息?

时间:2015-01-02 19:17:45

标签: laravel eloquent relationships

我有三个表:用户想法 ideas_likes 。 ideas_likes表看起来像:

ideas_likes
------------
id        primary key
user_id   foreign key
idea_id   foreign key
liked     boolean

用户和想法之间已经建立了一对多的关系。它看起来像这样:

class User extends Ardent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    protected $table = 'users';

    public function ideas()
    {
        return $this->hasMany('Idea');
    }   

}

同样,构思模型如下所示:

class Idea extends Ardent {

    protected $table = 'ideas';

    public function user()
    {
        return $this->belongsTo('User');
    }

}

我的第一个问题是:如何创建IdeaLike模型?一旦完成,使用Eloquent,我如何为用户检索所有喜欢的想法?

=============================================== ============================

Lucasgeiter的更新解决方案运作良好。

1 个答案:

答案 0 :(得分:1)

首先,不需要创建IdeaLike模型。您只需要一个many-to-many relationship

用户

public function ideas(){
    return $this->belongsToMany('Idea', 'ideas_likes')->withPivot('liked');
}

public function users(){
    return $this->belongsToMany('User', 'ideas_likes')->withPivot('liked');
}

(通过添加withPivot我告诉Laravel我希望结果中包含数据透视表中的liked

用法

$user = User::find(1);
$likedIdeas = $user->ideas()->where('liked', true)->get();


顺便说一句:如果它是模型名称的复数,则无需指定$table

更新

看起来你确实需要两者兼得,一对多和多对多的关系。

所以你的最终关系看起来像这样:

用户

public function ideas(){
    return $this->hasMany('Idea');
}

public function liked(){
    return $this->belongsToMany('Idea', 'ideas_likes')->withPivot('liked');
}

public function likes(){
    return $this->belongsToMany('User', 'ideas_likes')->withPivot('liked');
}

public function user(){
    return $this->belongsTo('User');
}

(我只是为那些对我有意义的关系选择了名字。你显然可以改变它们)

用法

某位用户提出的想法:(id = 1

$ideas = Idea::where('user_id', 1)->whereHas('likes', function($q){
    $q->where('liked', true);
})->get();