2017-09-27 1 views
0

Ich versuche, eine Liste der Datensätze aus einer Tabelle zu erhalten, wo die PK nicht in einer zusammengesetzten Tabelle ist. Wenn Sie sehen unter Tabelle, ich versuche, alle candidates, die nicht in einem pool sind, so in diesem Fall sollte ich nur Eric bekommen.beredt; Zeilen werden nicht in anderen Tabelle

+-------------+  +-------------+ 
| 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    | 
+---------+----------------+ 

Ich habe diese Antwort gefunden: https://laracasts.com/discuss/channels/eloquent/get-records-collection-if-not-exists-in-another-table

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

, die aber funktionieren sollte es in unserer ziemlich großen und schnell wachsenden Datenbank, auf einer Seite extrem ineffizient scheint, die von vielen oft zugegriffen wird von Leuten.

Im normalen MySQL würden Sie so etwas tun:

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

Hinweis: Die Tabellen sind nur eine einfache Darstellung, aber die eigentliche Datenbank Rüst- und Abfragen sind viel größer.

+0

Warum versuchen Sie nicht durch eine eloquente Beziehung zu Ihrem Modell Einstellung? Hast du es schon gemacht? Beispiel: Pool-Modell hat viele Kandidaten und Kandidaten-Modell gehört zu Pool. –

+0

@RutvijKothari Danke, aber das hängt nicht mit meiner Frage zusammen. – Richard

Antwort

0

Ich schaffte es mit Rahmen zu tun, wie folgt aus:

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; 

} 

es dann nennen mag:

$candidates = Models\Candidate::notInPool()->get(); 
Verwandte Themen