【问题标题】:How to exclude unpublished nodes from db_query results?如何从 db_query 结果中排除未发布的节点?
【发布时间】:2018-04-04 15:38:51
【问题描述】:

如何通过 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;
}

searh 是否可以根据节点表中的 nid 进行组合,或者更好的方法是在 while 循环中使用 Drupal 命令将它们过滤掉?

感谢您的帮助。

【问题讨论】:

  • 您最好使用EntityFieldQuerydrupal.org/docs/7/creating-custom-modules/howtos/…
  • 是,用 EFQ 替换整个查询。
  • 首先是可读性。这使得它在未来更好地维护。而且您无论如何都处于实体级别,所以为什么不使用为此而设计的功能。
  • 使用 EntityFieldQuery 或将节点表加入到您的查询中
  • SELECT f.question, f.nid FROM {faq_questions} f INNER JOIN {node} n ON f.nid = n.nid WHERE f.question LIKE :term ORDER BY f.question asc

标签: mysql sql drupal drupal-7


【解决方案1】:

您可以加入节点表,也可以按照上面 cmets 的建议使用 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 表肯定可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 2020-02-03
    • 2022-10-05
    • 2021-02-11
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多