Eloquent で JOIN
したテーブルのカラムで絞り込む場合の書き方です。
やり方
次のようにします。
1 2 3 4 5 6 7 8 |
$items = Item:: with(['a', 'b'])-> leftJoin('a', 'a.item_id', '=', 'items.id')-> leftJoin('b', 'b.item_id', '=', 'items.id')-> where('a.value', 4)-> orderBy('a.column_1', 'desc')-> orderBy('b.column_1', 'desc')-> orderBy('items.id', 'desc')->take(4)->get(['items.*']); |
Eloquent で使われる文字列は、 最終的にそのまま結合されますので、 (テーブル名).(カラム名)
という書き方をすればいいことになります。 with
を使う場合でも、 結合したテーブルのカラムを条件に刷る場合は leftJoin
をつける必要があります。 with
で指定されたテーブル(メソッド名)は、 メインのSQLが実行された後に再度SQLを実行して取得されますから。
そして気にするべきは、 orderBy
, get
の中でもテーブル名を指定してカラムを記述しているところです。 上で述べたとおり、文字列がそのまま結合されてSQLになりますから、テーブル名をつけずにSQLを実行するとどのテーブルのカラムか特定できず ambiguous column name というエラーが出ることがあります。 これはLaravel5 LEFT JOIN したら ID が null になった場合の対処法 にも書いたことです。