2017-01-12 8 views
3

Nachdem ein Problem mit Lehre Query Builder arbeiten und NICHT IN AussagenDoctrine2 Querybuilder NICHT IN Aussage nicht

Ich habe Tabelle mit vier Spalten und einige Daten:

id | directory_id| user_id | role_id 

1 1    10  null 
2 1    5  null 
3 1    null 1 
4 1    7  null 

Ich möchte alle Felder auszuwählen, die nicht innerhalb von zwei gegebenen Arrays von IDs.

$userIds = [10, 5]; 
$roleIds = [1]; 

Meine Frage:

$this->createQueryBuilder('da') 
    ->where('da.directory = :directory') 
    ->andWhere('da.user NOT IN (:userIds)') 
    ->andWhere('da.role NOT IN (:roleIds)') 
    ->setParameters([ 
     'directory' => $directory, 
     'userIds' => $userIds, 
     'roleIds' => $roleIds, 
     ]) 
     ->getQuery() 
     ->getResult(); 

wie ich es verstehe sollte ich die letzte Zeile zurückgeben (#id 4), aber es kam nicht.

Vielleicht weiß jemand, was falsch ist?

+3

NOT IN ist ein bisschen schwierig, wenn es um NULL geht. Wenn NULL zurückgegeben wird, wird NOT IN falsch und es werden überhaupt keine Zeilen zurückgegeben. Deshalb existiere ich normalerweise NICHT VORHANDEN. – jarlh

Antwort

2

Leider führen Vergleiche mit NULL Werten immer zu UNKNOWN, was ein falscher Wert ist.
Die Erklärung, die auf dem vierten Zeile ausgeführt wurde, ist die folgende:

(1 <> 10 AND 1 <> 5) AND (NULL <> 1) 

das in dem folgenden Ergebnisse und ist ein falsy Ergebnis

(TRUE AND TRUE) AND (UNKNOWN) 

NULL Werten Sie IS NULL verwenden Um zu testen, oder IS NOT NULL. Die folgende Abfrage sollte funktionieren:

$this->createQueryBuilder('da') 
    ->where('da.directory = :directory') 
    ->andWhere('(da.user NOT IN (:userIds) OR da.user IS NULL)') 
    ->andWhere('(da.role NOT IN (:roleIds) OR da.role IS NULL)') 
    ->setParameters([ 
     'directory' => $directory, 
     'userIds' => $userIds, 
     'roleIds' => $roleIds, 
    ]) 
    ->getQuery() 
    ->getResult();