首页 > 解决方案 > Laravel - 可以通过 Eloquent 关系完成条件连接吗?

问题描述

如何使用 Eloquent 关系完成以下任务?帖子可以被多个用户添加书签,每个用户只能将任何给定的帖子添加书签一次(如果书签被删除,记录将被删除)。我想检索所有带有当前登录用户是否为它们添加书签的帖子。

SELECT p.*, NOT(ISNULL(b.PostId)) Bookmarked
FROM Post p
LEFT JOIN (
    SELECT PostId FROM Bookmark WHERE UserId = {{ Auth::id() }}
) b
ON p.PostId = b.PostId

标签: sqllaraveljoineloquent

解决方案


我认为一个好的解决方案是创建一个数据透视表,如下所示:

Schema::create('users', function (Blueprint $table) {
    // Your users table
});

Schema::create('posts', function (Blueprint $table) {
    // Your posts table
});

Schema::create('post_user', function (Blueprint $table) {
    $table->integer('post_id')->unsigned();
    $table->integer('user_id')->unsigned();
});

比在您的Post模型中定义多对多关系:

public function bookmarkUsers() {
    return $this->belongsToMany('Your\User\Model');
}

与在您的控制器中相比,您可以检索用户添加书签的帖子:

//  [other stuff]
$posts = Post::whereHas('bookmarkedUsers', function($query) {
    $query->where('id', '=', Auth::id());
})->get();

推荐阅读