如何通过口才关系实现以下目标?帖子可以由多个用户添加书签,每个用户只能对任何给定的帖子添加一次书签(如果删除了书签,则记录将被删除)。我想检索所有带有当前登录用户是否已将其标记为书签的帖子。
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
答案 0 :(得分:0)
我认为一个好的解决方案是创建一个数据透视表,如下所示:
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
模型中定义一个Many to Many关系:
public function bookmarkUsers() {
return $this->belongsToMany('Your\User\Model');
}
比起在控制器中,您还可以由用户检索加书签的帖子:
// [other stuff]
$posts = Post::whereHas('bookmarkedUsers', function($query) {
$query->where('id', '=', Auth::id());
})->get();
答案 1 :(得分:0)
您可以使用withCount()
:
$posts = Post::withCount(['bookmarks as bookmarked', function($query) {
$query->where('UserId', Auth::id());
}])->get();
这需要建立bookmarks
关系:
BelongsToMany
表具有User
关系。HasMany
关系(速度稍快,但需要枢纽模型)。