我正在尝试使用laravel查询构建器复制一个这样的连接:
LEFT JOIN content_userdata ON content_id = content.id AND user_id = $user_id
我发现我可以在我的模型中使用以下功能来进一步增加“ons”,这个扩展了Enloquent
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变量的函数,其次即使我硬编码为测试目的,因为我已经做了上面(到“10”)Laravel包含它的意思是当它应该被解释为一个列名称不,像这样:
left join `content_userdata` on `content_id` = `content`.`id` and `user_id` = `10`
所以现在我有两个问题.
>使用查询范围时,我无法获取$user_id到join函数
>即使我无法将变量发送给连接,因为它总是将其解释为列名
为什么要这样做?
我意识到一个回应可能是把它放在一个地方.然而,我试图这样做,因为连接可能不一定返回任何结果(因此左连接),因为content_userdata表包含一个内容的用户评级.如果我使用的地方,则content_userdata表中的任何结果将不会被返回,如果我可以把它放在连接中,那么由于左连接将返回.
有没有办法在Laravel中实现这一点,如果不是什么替代方案,显然完全改变了Laravel的顶部,但我唯一可以想到的方法是将用户数据单独查询.
解决方法
您需要使用use关键字将变量传递给闭包,该关键字将变量导入范围.例:
public function scopeJoinUserData($query,function($join) use ($user_id) { $join->on('content_userdata_content_id','content.content_id') ->on('content_userdata_user_id',DB::raw($user_id)); }); }
这是一个PHP语法相关的问题,而不是Laravel限制!