2012-02-03 2 views
1
FIRST: 
id | name 
1 | sss 
2 | ddd 
5 | fff 

    $q = Doctrine_Query::create() 
    ->from('First a'); 

    return $q->execute(); 

SECOND: 
id | first_id | name 
.... 


    $two = Doctrine_Query::create() 
    ->from('Second a') 
    ->whereInNot(first_id, $q) // ??????? 
    ; 

    return $two->execute(); 

Comment puis-je obtenir toutes les données de la table SECOND sans first_id existant dans la table FIRST?Où In Not - doctrine

+0

Problèmes avec votre code comprennent: les premiers retours de la requête un Doctrine_Collection (comme une liste de Doctrine_Records), qui n'est PAS un tableau que vous pouvez alimenter dans la deuxième requête. La méthode dont vous avez besoin est également "whereNotIn()" plutôt que "whereInNot()". J'ai fourni deux exemples dans ma réponse pour savoir comment vous pouvez coder ceci, selon que vous avez réellement besoin de connaître les first_ids ou non. – ybull

Répondre

2

approche un (similaire à votre exemple de code):

// Retrieve ONLY the id, and use hydration mode that produces a simple array of results. 
$first_ids = Doctrine_Query::create() 
    ->select('f.id') 
    ->from('First f') 
    ->execute(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR); 

$two = Doctrine_Query::create() 
    ->from('Second s') 
    ->whereNotIn('first_id', $first_ids); 
return $two->execute(); 

Une autre approche pour obtenir le même résultat dans une seule requête composée:

$two = Doctrine_Query::create() 
    ->from('Second s') 
    ->where('first_id NOT IN (SELECT id FROM First)'); 
return $two->execute();