2016-04-20 16 views
1

Ich habe Products hasMany Tasks.CakePHP 3 Suchen Sie Datensätze, die keinen verknüpften Datensatz haben (hasMany)

Was ist der beste Weg, um alle Produkte zu finden, die keinen zugeordneten Datensatz in der Aufgaben-Tabelle haben?

Ich habe versucht, mit:

$query->matching('Tasks', function ($q) { 
return $q->where(['Tasks.product_id' => NULL}); 

Aber das scheint nicht den Trick zu tun.

+1

Wenn Sie 3.1 oder höher verwenden, könnte [notMatching] (http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#using-notmatching) sein die Lösung. –

Antwort

4

ich Rat Sie Subqueries

Es ist die einfachste Art und Weise zu verwenden, um alle Produkte zu finden, die einen zugehörigen Datensatz nicht haben .. Try this:

$matchingTasks= $this->Products->association('Tasks')->find() 
     ->select(['product_id'])// id of product in Tasks Table 
     ->distinct(); 

    $query = $this->Products->find() 
     ->where(['id NOT IN' => $matchingTasks]); 
    // to debug the result 
     foreach($query as $product){ 
     debug($product); 
    } 
    die(); 
+0

Ich frage mich, ob es einen kürzeren Befehl für diese Aufgabe gibt, da in mysql seine nur 3 Zeilen: SELECT * FROM 'Produkte' Left Outer JOIN' Produkte' ON Products.id = Task.product_id wo products.id ist null – Andrewboy

0

Als Greg Schmidt schrieb: notMatching ist die Lösung:

$query = $articlesTable->find()->notMatching('Tags'); 

oder

$query = $articlesTable 
->find() 
->notMatching('Tags', function ($q) { 
    return $q->where(['Tags.name' => 'boring']); 
});