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

标签 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 来组合搜索,或者更好的方法是在 while 循环中使用 Drupal 命令过滤掉它们?

感谢您的帮助。

最佳答案

您可以加入节点表,也可以按照上面的建议使用 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,您将逻辑直接绑定(bind)到您无法控制的数据库模式。如果 future 的模块更新要更改模式,您将破坏需要更新的代码。

虽然节点表不太可能发生任何重大变化,但 faq_questions 表肯定可以。

关于mysql - 如何从 db_query 结果中排除未发布的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49655161/

相关文章:

java - 将 MySql 查询转换为 JPA 命名查询

mysql - 高效的 SQL 查询

mysql - 根据sql计数运行SQL语句

mySQL:从上一个间隔获取 3 个月的间隔

带有 Union All 的 View 中的 MySQL Case 语句

Drupal 8 - 如何为特定节点类型添加任务和上下文链接?

mysql - 将我的 drupal 7 站点移至新服务器,无法登录

PHP 表单转储整个 MySQL 数据库,除非数据库中不存在任何输入变量

mysql - 在 JOIN 中使用 DISTINCT 会造成麻烦

Where 子句中的 PHP 变量字符串为空