2016-10-26 20 views
1

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プラグインの名前は何ですか?)に渡さずにそのようなクエリを作成する方法を知っている人はいますか?

+0

https://laravel.com/docs/5.3/eloquent-relationshipsを参照してください。 –

答えて

0

"get"メソッドを実際に呼び出すことはないようです。これを試してみてください:?

<?php 

$userid = 10; 
$result = DB::table('route') 
->join('user_route', 'route.id', '=', 'user_route.route_id') 
->select('*') 
->where('user_route.user_id', '=', $userid) 
->get(); 

>

は、あなたのテーブルに基づいて、正しいキーを追加する必要があります注意してください。あなたのデータ構造を見ることができれば、これはもっと簡単になります。

0

EloquentのDoesntHave()メソッドを見てください。関連するテーブルにレコードを持たないレコードをフィルタリングすることができます。

あなたの場合、次の操作を行います。特定のユーザーに対して、そのユーザーに関連しないすべてのルートを取得します。

// $userId contains the ID of the user for which you want to get the unrelated routes 
$routes = Route::whereDoesntHave('users', function($query) use ($userId) { 
    $query->where('id', '!=', $userId); 
})->get(); 

はちょうどあなたがユーザー関係があなたのルートモデルで定義されていることを確認してください:次のコードは、トリックを行う必要があります。

+0

回答ありがとうございますが、私は結合テーブルuser_routeを持っています。これらの3つのテーブルはどこで一緒に参加しますか? –

+0

あなたはしません。 Eloquentは内部的にこの中間テーブルを結合に使用します。 –