web-dev-qa-db-fra.com

Jointure et recherche de valeurs NULL

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. En outre, 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 des nœuds à deux autres: flag_content et field_data_field_question (ce dernier tableau indique si une publication est ou non une question).

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 valeurs NULL dans une requête?

18
maxedison

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');
31
Clive