Bergabung dan mencari nilai NULL

19

Saya menggunakan modul flag untuk memungkinkan pengguna menandai pertanyaan mereka sebagai diselesaikan, mirip dengan cara kerjanya di situs ini. Karena itu saya ingin membiarkan pengguna memfilter posting untuk hanya menampilkan pertanyaan yang tidak terpecahkan. Selain itu, beberapa posting mungkin bukan pertanyaan sama sekali. Oleh karena itu, mereka tidak dapat memiliki bendera "terpecahkan", tetapi mereka juga TIDAK boleh muncul di hasil ketika memfilter hanya dengan pertanyaan yang belum terpecahkan. Oleh karena itu, saya perlu bergabung dengan tabel simpul dengan dua orang lain: flag_contentdan field_data_field_question(tabel terakhir ini adalah yang memberitahukan apakah posting adalah pertanyaan atau tidak).

Inilah kode saat ini yang saya coba:

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

Namun, ini menghasilkan kesalahan berikut:

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

Apakah ini bukan cara yang benar untuk meneruskan NULLnilai ke dalam kueri?

maxedison
sumber

Jawaban:

31

Basis data API sebenarnya memiliki cara yang disukai untuk menambahkan ekspresi jenis ini, yaitu fungsi SelectQuery::isNull()dan SelectQuery::isNotNull(). Anda dapat menggunakannya seperti ini:

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

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