如何在laravel中使用eloquent模型在一个子句中使用join和where

时间:2018-04-14 06:45:14

标签: laravel-5 eloquent

我只是laravel的新手,我在加入有条件的桌子时遇到了麻烦。

我有3张桌子。

    Table 1 : users
        $users->increments('id');
        $users->string('name');
        $users->string('email')->unique();
        $users->string('password');
        $users->rememberToken();
        $users->timestamps();

    Table 2 : articles
        $articles->increments('id');
        $articles->string('title');
        $articles->string('content');
        $articles->integer('user_id')->unsigned();
        $articles->timestamps();

        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade');

    Table 3 : Follows
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('blogger_id')->unsigned();
        $table->timestamps(); 

        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade');
        $table->foreign('blogger_id')
            ->references('user_id')->on('articles')
            ->onDelete('cascade');

这是当用户创建文章时会发生什么,它将保存到文章表中,包括他的用户ID。作为用户,我可以关注他。当我关注他时,我的用户ID和他的用户ID将分别保存在下表中,分别为user_id和blogger_id。

我想要发生的事情是当我登录我关注的博主的文章将在我的主页上显示。这是我尝试的但我有错误。

    on my Follow Model :
       class Follow extends Model
        {
            function follows(){
             return $this->belongsTo('App\Article');
           }
         }

     on my homeController:
         $current_user = Auth::user();
         $followings = \App\Follow::where('user_id',$current_user->id);
         $result = $followings->follows();

这给了我一个错误:方法Illuminate \ Database \ Query \ Builder :: follow不存在。

我试图寻找与答案混淆的答案。

1 个答案:

答案 0 :(得分:0)

你不能为这样的联接使用关系。

首先,你必须改变你的关系:

class Follow extends Model
{
    function follows(){
        return $this->hasMany('App\Article', 'user_id', 'blogger_id');
    }
}

然后你可以像这样使用它:

$followings = \App\Follow::where('user_id', $current_user->id)->with('follows')->get();
$articles = $followings->pluck('follows')->collapse();