如何从db_query结果中排除未发布的节点?

时间:2018-04-04 15:38:51

标签: mysql sql drupal drupal-7

如何通过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命令将它们过滤掉?

感谢您的帮助。

1 个答案:

答案 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表当然可以。