sql - 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
解决方案
我认为一个好的解决方案是创建一个数据透视表,如下所示:
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();
推荐阅读
- matplotlib - matplotlib 子图与 matshow
- python - python中的文本文件
- javascript - 在 Heroku 上构建之前如何在项目上运行 javascript 代码
- keras - Keras 模型嵌套在自定义 Keras 层内
- swift - 使用 MKLocalSearch 填充 UITableView
- javascript - 阻止 SocketIO 重新连接,一旦使用不同的地址建立成功的连接
- python - 调用 super 的 forward() 方法
- javascript - 如何从输入中执行 JavaScript 代码
- amazon-web-services - AWS Cloudformation - 如何使用 If Else 条件
- ag-grid - 如何获取 cellEditorSelector 值