2017-09-27 3 views
0

私はテーブルからレコードのリストを取得しようとしていますが、PKはコンポジットテーブルにありません。下の表を参考にしてみると、candidatespoolには含まれていないので、この場合はEricしか得られません。しかし、それはたくさんによって頻繁にアクセスされるページに、私たちはかなり大きく、急速に成長しているデータベースでは極めて非効率的と思われる、https://laracasts.com/discuss/channels/eloquent/get-records-collection-if-not-exists-in-another-tableEloquent;他のテーブルにない行を取得する

$crashedCarIds = CrashedCar::pluck('car_id')->all(); 
$cars = Car::whereNotIn('id', $crashedCarIds)->select(...)->get(); 

動作するはずです:

+-------------+  +-------------+ 
| candidates |  | pools  | 
+-------------+  +-------------+ 
| id | name |  | id | name | 
+----+--------|  +----+--------| 
| 1 | John |  | 1 | Pool A | 
| 2 | Richard|  | 2 | Pool B | 
| 3 | Eric |  | 3 | Pool C | 
+----+--------+  +----+--------+ 

+--------------------------+ 
| candidate_pools   | 
+--------------------------+ 
| pool_id | candidate_id | 
+---------+----------------| 
| 1  | 1    | 
| 1  | 2    | 
| 3  | 2    | 
| 2  | 1    | 
+---------+----------------+ 

私はこの答えを見つけました人の。

は、通常のMySQLでは、あなたはこのような何かをするだろう:

WHERE candidates.id NOT IN 
(SELECT candidate_id 
      FROM candidate_pools 
     LEFT JOIN pools 
      ON candidate_pools.pool_id = pool.id 
) 

注:表には、単純なイラストですが、実際のデータベースのセットアップおよびクエリがたくさん大きくなっています。

+0

なぜあなたはあなたのモデルと雄弁な関係を設定することでみません?のようにそれを呼び出すその後

public function scopeNotInPool($query) { $query->whereNotIn('candidate_id', function ($query) { $query->select('candidate_id') ->from('candidate_pool') ->join('pool', function ($join) { $join->on('pool.id', '=', 'candidate_pool.pool_id'); } ) ; }); return $query; } 

あなたはすでにそれをしましたか?たとえば、プールモデルには多数の候補があり、候補モデルにはbelongsToプールがあります。 –

+0

@RutvijKothariありがとうございますが、それは私の質問には関係ありません。 – Richard

答えて

0

私はこのように、スコープを使用してそれを行うために管理:

$candidates = Models\Candidate::notInPool()->get(); 
関連する問題