laravelクエリビルダーを使用して、そのように結合を複製しようとしています:
LEFT JOIN content_userdata
ON content_id = content.id
AND user_id = $user_id
Eloquentを拡張するモデルで次の関数を使用して、追加の「オン」を実行できることを発見しました
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);
});
}
しかし、これは 2 つの問題を引き起こします。まず、 $user_id 変数を関数に取得できません。次に、上記で行ったようにテスト目的で (int "10" に) ハードコーディングしても、Laravel はそれを ` で囲みます。つまり、必要なときに列名として解釈されることを意味します。そうではありません:
left join `content_userdata`
on `content_id` = `content`.`id`
and `user_id` = `10`
だから今、私は2つの問題を抱えています。
- クエリ スコープを使用している場合、結合関数に $user_id を取得できません
- 変数は常に列名として解釈されるため、変数を結合に送信できません。
なぜ私はこれをしたいのですか? 1つの対応は、それをどこに置くことかもしれないことに気づきました。ただし、 content_userdata テーブルにはコンテンツに対するユーザーの評価などのものが含まれているため、結合が必ずしも結果を返すとは限らないため (したがって、左の結合)、この方法で実行しようとしています。where を使用すると、content_userdata テーブルに何もない結果は返されませんが、結合に入れることができるかのように、左結合のために返されます。
とにかくLaravelでこれを達成する方法はありますか?代替手段がない場合は、Laravelを完全に変更することは明らかですが、私が考えることができる唯一の代替手段は、別のクエリでユーザーデータを取得することです.