whereを条件にしてlaravel query builderを使用して左外部結合を行いたいと思います。Laravel query builder with left outer join
- ユーザ(ID、名前、..)
- 経路(ID、名前、..)
- user_route(ID、USER_ID、route_id)
: 私は3つのテーブルを持っています特定のユーザーのuser_routeテーブルにリストされていないすべてのルートを選択したいとします。私が試した何
:
$q = DB::table('route')
->join('user_route', 'route.id', '=', user_route.route_id', 'left outer')
->where('user_route.user_id', '!=', $filter->user);
これは行は戻されません。
$q = DB::table('route')
->leftJoin('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id')
->where('user_route.user_id', '=', DB::raw($filter->user));
});
これは、外部結合ではないため、すべてのルートを返します。
$q = DB::table('route')
->join('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id')
->where('user_route.user_id', '=', DB::raw($filter->user));
}, 'left outer');
または
$q = DB::table('route')
->join('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id', 'left outer')
->where('user_route.user_id', '=', DB::raw($filter->user));
});
それらのどれも働いた:
はまた、このような何かを試してみました。
私は、左結合ですべてのルートを選ぶ醜い回避策を作りました。そしてPHPでは、user_idがNULLでないルートを削除します(例:存在する)。
SQLでこれを実行してEloquent(またはLaravelのDBプラグインの名前は何ですか?)に渡さずにそのようなクエリを作成する方法を知っている人はいますか?
https://laravel.com/docs/5.3/eloquent-relationshipsを参照してください。 –