LaravelのEloquentとDBファサードでJOINを実現する方法
LaravelフレームワークでSQLのJOIN句を実装する方法をメモします。
各JOINの種類ごとに、Laravelのモデル操作機能であるEloquentとDBファサード両方のパターンをそれぞれ記載していきます。
1. 基本のINNER JOIN
以下のSQLクエリをEloquentとDBファサードで書き換えます。
SELECT orders.id, customers.name
FROM orders
JOIN customers ON orders.customer_id = customers.id
WHERE orders.status = :status;
Eloquentでの実装:
$orders = Order::join('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->where('orders.status', $status)
->get();
DBファサードを用いた実装:
use Illuminate\Support\Facades\DB;
$orders = DB::table('orders')
->join('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->where('orders.status', $status)
->get();
2. LEFT JOIN(左外部結合)
Eloquent:
$orders = Order::leftJoin('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->get();
DBファサード:
$orders = DB::table('orders')
->leftJoin('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->get();
3. RIGHT JOIN(右外部結合)
Eloquent:
$orders = Order::rightJoin('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->get();
DBファサード:
$orders = DB::table('orders')
->rightJoin('customers', 'orders.customer_id', '=', 'customers.id')
->select('orders.id', 'customers.name')
->get();
4. CROSS JOIN(交差結合)
Eloquent:
$orders = Order::crossJoin('customers')->get();
DBファサード:
$orders = DB::table('orders')
->crossJoin('customers')
->get();
5. 複数のJOINを組み合わせる
Eloquent:
$orders = Order::join('customers', 'orders.customer_id', '=', 'customers.id')
->join('products', 'orders.product_id', '=', 'products.id')
->select('orders.id', 'customers.name', 'products.product_name')
->get();
DBファサード:
$orders = DB::table('orders')
->join('customers', 'orders.customer_id', '=', 'customers.id')
->join('products', 'orders.product_id', '=', 'products.id')
->select('orders.id', 'customers.name', 'products.product_name')
->get();
まとめ
- LaravelのEloquentでは、
join()
メソッドを使うことでSQLのJOIN
を実装できます。 -
leftJoin()
、rightJoin()
、crossJoin()
などを使用することで様々なJOINを実現可能です。 - DBファサードを使用すると、より柔軟にSQLライクなクエリを書くことができます。
今後もLaravelでのアプリケーション開発業務で覚えた知識をシェアしていきたいと思います。