我正在尝试使用 laravel 查询生成器复制这样的连接:
LEFT JOIN content_userdata
ON content_id = content.id
AND user_id = $user_id
我发现我可以在扩展 Eloquent 的模型中使用以下函数做额外的“on”
public function scopeJoinUserData($query, $user_id)
{
return $query->leftJoin('content_userdata', function($join)
{
$join->on('content_userdata_content_id', '=', 'content.content_id')->on('content_userdata_user_id', '=', 10);
});
}
但这会产生两个问题。首先,我无法将 $user_id 变量放入函数中,其次,即使我像上面所做的那样出于测试目的对其进行硬编码(到 int "10"),Laravel 将它封装在 ` 中,这意味着它在应该被解释为列名时不是,像这样:
left join `content_userdata`
on `content_id` = `content`.`id`
and `user_id` = `10`
所以现在我有两个问题。
- 使用查询范围时,我无法将 $user_id 放入连接函数
- 即使可以,我也无法将变量发送到联接,因为它总是将其解释为列名
我为什么要这样做? 我意识到一种反应可能是将它放在哪里。但是我试图这样做,因为连接可能不一定会返回任何结果(因此是左连接),因为 content_userdata 表包含诸如用户对一段内容的评分之类的东西。如果我使用 where 则不会返回 content_userdata 表中没有任何内容的结果,如果我可以将其放入联接中,那么由于左联接,它们将被返回。
无论如何在 Laravel 中实现这一点,如果没有什么替代方案,显然完全改变放弃 Laravel 是最重要的,但我能想到的唯一替代方案是在单独的查询中获取用户数据。