Laravel-有条件的连接可以通过雄辩的关系实现吗?

时间:2018-08-23 16:09:56

标签: sql laravel join 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

2 个答案:

答案 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关系(速度稍快,但需要枢纽模型)。