mysql - drupal sql 多个表的条件子句?

标签 mysql sql drupal drupal-7

我对常见问题解答搜索模块进行了以下查询,修改后可在 Drupal 7 中使用, 它在两个表中搜索:1) 标题 2) 正文,但无法再包含一个表。

$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100));

$query = "SELECT DISTINCT fq.title, fq.nid
 FROM {node} AS fq, {field_data_body} AS f
 WHERE fq.title LIKE :term
 OR fq.type LIKE :term
 OR f.body_value LIKE :term
 AND f.entity_id = fq.nid";

$result = db_query($query, array(':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%'));

我想再添加一个以在搜索中包含详细问题字段,但我认为 nid 的链接是问题所在?我尝试将两者都放入一个子句中,但似乎是错误的。请帮忙:)

AND (fd.entity_id = fq.nid OR fb.entity_id = fq.nid)";

$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100));
$query = "SELECT DISTINCT fq.title, fq.nid
    FROM {node} AS fq, {field_data_field_detailed_question} AS fd, {field_data_body} AS fb
    WHERE fq.title LIKE :term
    OR fd.field_detailed_question_value LIKE :term
    OR fb.body_value LIKE :term
    AND (fd.entity_id = fq.nid OR fb.entity_id = fq.nid)";
$result = db_query($query, array(':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%'));

$string = "";
while ($row = $result->fetchObject()) {
    $string .= "<a href='/" . drupal_get_path_alias('node/' . $row->nid) . "'>" . $row->title . "</a>"; 
}
echo $string;

更新:感谢 Syscall 帮助我使他的方法发挥作用(请参阅聊天)。

我还设法删除了空空格(通过添加新变量并使用 array_filter > 我猜问题是在 array_map 仍然创建空字符串的同时分割空格和修剪。)并添加一个条件来排除未发布的节点通过 db_and() 引用 n.status = 1。

$terms = explode(' ', $term); // split using ' '
$terms = array_map('trim', $terms); // remove unwanted spaces
$termsfiltered = array_filter($terms);
$or = db_or();
foreach ($termsfiltered as $term) {
    $or->condition('fd.field_detailed_question_value', '%'.db_like($term).'%', 'LIKE');
    $or->condition('fb.body_value','%'.db_like($term).'%' , 'LIKE');
    $or->condition('n.title','%'.db_like($term).'%' , 'LIKE');
}
$and = db_and()->condition('n.status','1' , 'LIKE');

$query = db_select('node', 'n');
$query->fields('n');
$query->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid');
$query->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid');
$query->condition($or);
$query->condition($and);
$stmt = $query->execute(); // execute the query (returns the "statement" to fetch).

附:插入 var_dump($variabletodump); 在更改代码和查看数组效果以解决问题时确实很有帮助。

最佳答案

您无法在 Drupal 查询中链接 leftJoin(或任何 join),因为 leftJoin()返回别名,而不是查询。那么你应该使用execute() “运行”查询。

$or = db_or()
  ->condition('fd.field_detailed_question_value', '%'.db_like($term ).'%', 'LIKE')
  ->condition('fb.body_value','%'.db_like($term ).'%' , 'LIKE');

$query = db_select('node', 'n');
$query->fields('n');
$query->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid');
$query->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid');
$query->condition($or);
$stmt = $query->execute(); // execute the query (returns the "statement" to fetch).

while ($row = $stmt->fetchObject()) {
    //..
}

您必须添加字段:

$query = db_select('node', 'n')->fields('n');

$query = db_select('node', 'n')
         ->addField('n','title')
         ->addField('n','nid');

关于mysql - drupal sql 多个表的条件子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676437/

相关文章:

sql - 在 SQL 中保存顺序首选项

php - 旧的 CMS/博客网站会怎样?

drupal - 如何在drupal中获取所有分类子ID

java - 在数据库更新时调用客户端的方法

mysql - 是否有用于纠正 Rails 应用程序中时区错误的 ruby​​ 脚本或 gem?

mysql - SELECT(带 LEFT JOIN)sql 查询,删除 sql 查询

variables - 如何在 Twig 过滤器中使用变量 'replace'

php - 我不明白为什么这些 PHP 脚本之一不起作用

mysql - 在 Mac 上并行使用 Postgre 和 MySQL

php - Ajax聊天系统-使用查询从表中选择两次