【问题标题】:drupal sql conditional clauses for multiple tables?多个表的drupal sql条件子句?
【发布时间】:2018-04-05 15:42:35
【问题描述】:

我在 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); 在更改代码和查看数组效果以解决问题时非常有帮助。

【问题讨论】:

    标签: mysql sql drupal drupal-7


    【解决方案1】:

    您不能在 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');
    

    【讨论】:

    • 感谢@Syscall!我见过类似的例子,并且已经在想。我试过你的,它没有给我错误但没有返回任何结果:(我仔细检查了表和列名,它们听起来不错。这是否适用于$string = ""; while ($row = $result-&gt;fetchObject()) { $string .= "&lt;a href='/" . drupal_get_path_alias('node/' . $row-&gt;nid) . "'&gt;" . $row-&gt;title . "&lt;/a&gt;"; } echo $string;
    • 不确定,while 循环应该打印结果,但没有显示任何内容。 (不知道在执行搜索时我还能如何检查数组)
    • @Markus 请尝试$results = $stmt-&gt;fetchAll(); var_dump($results);。注意,您可以使用&lt;a href="'.url('node/'.$row-&gt;nid).'"&gt;...&lt;/a&gt;(不带初始斜线)。
    • @Markus 哦!你有$query-&gt;addField('n','title'); 吗?你需要在SELECTFROM 之间有一些东西。请参阅addField()$query-&gt;fields('n');。 (见fields() - 我已经更新了答案(See db_select()-&gt;fields())。
    • var_dump() 用于调试。请刷新您的页面,答案已更新 - 请参阅最后一部分。
    【解决方案2】:
    $or = db_or()
      ->condition('fd.field_detailed_question_value', '%'.db_like($term ).'%', 'LIKE')
      ->condition('fb.body_value','%'.db_like($term ).'%' , 'LIKE');
    
    $results = db_select('node', 'n')
      ->fields('n', array('nid', 'title'))
      ->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid')
      ->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid')
      ->condition($or)
      ->execute()
      ->fetchAll();
    
    var_dump($results);
    

    db_select documentation

    db_or documentation

    【讨论】:

    • 哇谢谢@Fky!我想了解更多有关 drupal 查询的信息,这很有帮助。我试过了,但得到了"FATAL ERROR: CALL TO A MEMBER FUNCTION LEFTJOIN() " for 2nd leftJoin。 (我知道这是 EFQ 而不是 SQL 查询,因此这取代了我的整个 $query)。
    • 我错过了字段说明,所以我编辑了我的帖子你可以再试一次@Markus
    • 谢谢,稍后我会试一试,根据您的原始帖子作为第一个答案,看起来与另一个非常接近 :) 当 $term 有多个关键字时,即。 “测试橙色苹果”,让查询搜索任何单词的最佳方法是什么(如 phpmyadmin 具有此搜索功能)?我担心这是否可能是一个非常复杂的查询,但是当人们有多个关键字时才意识到没有它,他们将不会得到任何结果(并且可能认为它不起作用/更糟糕的用户体验)。可能应该打开一个新问题?
    • 仅供参考 - 刚刚看到 Syscall 在聊天中添加了一些 cmets 以使用 $terms 和 explode、array_map 并通过 foreach 循环。会尝试的。 chat.stackoverflow.com/rooms/168333/…
    猜你喜欢
    • 2019-02-09
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2015-09-29
    • 1970-01-01
    • 2017-06-11
    • 2019-03-01
    相关资源
    最近更新 更多