drupal sql 多个表的条件子句?
drupal sql conditional clauses for multiple tables?
我修改了以下查询以在 Drupal 7 中运行的 FAQ 搜索模块,
它在两个表中搜索:1) title 2) body 但没有设法再包含一个。
$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 > 我猜问题是在拆分空格和 trim 的同时 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).
p.s。插入 var_dump($variabletodump); 在更改代码和查看数组的效果以解决问题时真的很有帮助。
$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);
您不能在 Drupal 查询中链接 leftJoin
(或任何 join
),因为 leftJoin()
returns the alias, not the query. Then you should use execute()
到 "run" 查询。
$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');
我修改了以下查询以在 Drupal 7 中运行的 FAQ 搜索模块, 它在两个表中搜索:1) title 2) body 但没有设法再包含一个。
$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 > 我猜问题是在拆分空格和 trim 的同时 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).
p.s。插入 var_dump($variabletodump); 在更改代码和查看数组的效果以解决问题时真的很有帮助。
$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);
您不能在 Drupal 查询中链接 leftJoin
(或任何 join
),因为 leftJoin()
returns the alias, not the query. Then you should use execute()
到 "run" 查询。
$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');