我在drupal 7中修改了下面的FAQ搜索模块查询,该模块可以在两个表中进行搜索: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或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).
ps插入 var_dump($ variabletodump); 在更改代码和查看数组的效果以解决问题时确实很有帮助。
您不能在Drupal查询中链接leftJoin(或任何join),因为它leftJoin()返回别名而不是查询。然后,您应该使用execute()“运行”查询。
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');