【问题标题】:Laravel - Can a conditional join be accomplished with an Eloquent relationship?Laravel - 可以通过 Eloquent 关系完成条件连接吗?
【发布时间】:2019-01-30 02:02:50
【问题描述】:

如何使用 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

【问题讨论】:

  • 不是真正的条件连接,它是标准的左连接。具体有什么想不通的?您是否尝试将 leftJoin() 与查询构建器一起使用?
  • 是的,使用查询生成器没有问题。特别想知道这是否可以通过 Eloquent 模型关系来完成,即每个 Post 上的 hasOne 以 Auth::id() 为条件

标签: sql laravel join eloquent


【解决方案1】:

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

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();

【讨论】:

  • 这就是我的表格的有效设置方式。但是,我正在尝试检索所有帖子,无论它们是否已添加书签,而是带有一个指示器。
【解决方案2】:

你可以使用withCount():

$posts = Post::withCount(['bookmarks as bookmarked', function($query) {
    $query->where('UserId', Auth::id());
}])->get();

这需要bookmarks 关系:

  • BelongsToManyUser 表的关系。
  • HasMany 与数据透视表的关系(快一点,但需要数据透视模型)。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2015-08-21
    • 2014-11-15
    • 2020-03-04
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多