如何通过db_query排除未发布的节点?
我认为它们被定义为
SELECT * FROM `node` WHERE status = '1'
但是如何在下面的drupal db_query中包含它?
function faq_search_find() {
$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100));
$result = db_query("SELECT question, nid
FROM {faq_questions}
WHERE question LIKE :term
ORDER BY question asc", array(':term' => '%%' . $term . '%%'));
$string = "";
while ($row = $result->fetchObject()) {
$string .= "<a href='/" . drupal_get_path_alias('node/' . $row->nid) . "'>" . $row->question . "</a>";
}
echo $string;
exit;
}
可以根据节点表中的nid组合searh,还是更好的方法是使用while循环中的Drupal命令将它们过滤掉?
感谢您的帮助。
答案 0 :(得分:2)
您可以加入节点表,也可以使用EFQ作为上述评论建议。但这是SQL
$result = db_query("SELECT question, nid
FROM {faq_questions} F1
INNER JOIN {node} N1
ON F1.nid = N1.nid AND N1.status = 1
WHERE question LIKE :term
ORDER BY question asc", array(':term' => '%%' . $term . '%%'));
如果你想要一个实际的解释,为什么你应该使用EFQ ...虽然通常情况下SQL是适合这项工作的工具,但实际上这不是其中之一。通过编写原始SQL,您可以将逻辑直接绑定到无法控制的数据库模式。如果将来的模块更新要更改架构,那么您将需要更新需要更新的代码。
虽然节点表不太可能以任何显着的方式改变,但faq_questions表当然可以。