Junta e procura valores NULL

19

Estou usando o módulo sinalizador para permitir que os usuários marquem suas perguntas como resolvidas, semelhante à maneira como funciona neste site. Portanto, quero permitir que os usuários filtrem as postagens para mostrar apenas perguntas não resolvidas. Além disso, algumas postagens podem não ser perguntas. Portanto, eles não podem ter um sinalizador "resolvido", mas também NÃO devem aparecer nos resultados ao filtrar apenas por perguntas não resolvidas. Portanto, preciso unir a tabela de nós com outras duas: flag_contente field_data_field_question(esta última tabela é o que informa se uma postagem é ou não uma pergunta).

Aqui está o código atual que estou tentando:

$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');

No entanto, isso resulta no seguinte erro:

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).

Essa não é a maneira correta de passar NULLvalores para uma consulta?

maxedison
fonte

Respostas:

31

A API do banco de dados, na verdade, tem uma maneira preferida de adicionar expressões desse tipo, a saber, as funções SelectQuery::isNull()e SelectQuery::isNotNull(). Você pode usá-los assim:

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

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