Jointure et recherche de valeurs NULL

19

J'utilise le module indicateur pour permettre aux utilisateurs de marquer leurs questions comme résolues, de la même manière que cela fonctionne sur ce site. Je souhaite donc permettre aux utilisateurs de filtrer les messages pour n'afficher que les questions non résolues. De plus, certains messages peuvent ne pas être du tout des questions. Par conséquent, ils ne peuvent pas avoir d'indicateur "résolu", mais ils ne devraient pas non plus apparaître dans les résultats lors du filtrage uniquement par des questions non résolues. Par conséquent, je dois joindre la table de noeud avec deux autres: flag_contentet field_data_field_question(cette dernière table est ce qui indique si une publication est une question ou non).

Voici le code actuel que j'essaie:

$query->join('flag_content', 'f', 'f.content_id = n.nid AND f.content_type = "node" AND f.fid = 5');
$query->join('field_data_field_question', 'q', 'q.entity_id = n.nid AND q.field_question_value = 1');
$query->condition('f.fid', 'NULL', 'IS');
$query->condition('q.field_question_value', 'NULL', 'IS NOT');

Cependant, cela entraîne l'erreur suivante:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''NULL') AND (q.field_question_value IS NOT 'NULL')
LIMIT 21 OFFSET 0' at line 4: SELECT n.nid AS nid
FROM
{node} n
INNER JOIN {field_data_field_category} t ON t.entity_id = n.nid
INNER JOIN {flag_content} f ON f.content_id = n.nid AND f.content_type = "node" AND f.fid = 5 
INNER JOIN {field_data_field_question} q ON q.entity_id = n.nid AND q.field_question_value = 1
WHERE (t.field_category_tid = :db_condition_placeholder_0) AND (f.fid IS :db_condition_placeholder_1) AND (q.field_question_value IS NOT :db_condition_placeholder_2)
LIMIT 21 OFFSET 0; Array 
( [:db_condition_placeholder_0] => 464 [:db_condition_placeholder_1] => NULL [:db_condition_placeholder_2] => NULL
)
in queryExecuteRender_recentActivity() (line 57 of someFile.php).

N'est-ce pas la bonne façon de passer des NULLvaleurs dans une requête?

maxedison
la source

Réponses:

31

L'API de base de données a en fait un moyen préféré d'ajouter des expressions de ce type, à savoir les fonctions SelectQuery::isNull()et SelectQuery::isNotNull(). Vous pouvez les utiliser comme ceci:

$query->isNull('f.fid');

$query->isNotNull('q.field_question_value');
Clive
la source