如何在db_select()查询中建立LIKE条件?


14

您如何LIKEdb_select()查询中建立条件?

我知道如何通过db_query()API调用执行此操作,但是是否有特殊的语法/方法来执行此操作db_select()


2
仅供以后参考,您可以将任何内容db_query作为参数传递给占位符,也可以将其作为参数传递给...Query::condition。您不会为每种不同类型的查询找到每个操作员的文档,因为这样做是没有意义的。这一切都会在一天结束时通过PDO,如果db_like为正确地准备了一个变量db_query,那么根据定义它将为正确地准备相同的变量db_select
克莱夫(Clive

2
在没有人提出建议之前,除非您能找到有关db_select + LIKE的问题,否则我认为我们对此没有意见。我们有db_query + LIKE,但是即使答案相同,问题也有所不同。
mpdonadio

Answers:


21

深入研究Drupal文档后,在db_like API文档页面和SelectQuery:condition handler doc页面中找到了解决方案。

例如

$result = db_select('field_data_field_name', 'f')->fields('f', array(
    'entity_id',
    'field_name_value'
))
->condition('entity_type', 'user')
->condition('bundle', 'user')
->condition('deleted', 0)
->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
->distinct()
->range(0, 10)
->execute();

用于类似查询的条件是

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')

2
这里需要注意的两件事是(1)db_like()需要正确地转义参数,(2)需要显式添加通配符。它还将使用数据库上的默认排序规则,我认为没有任何方法可以指定其他排序规则。
mpdonadio

1
今天晚些时候,我可能会通过一些讨论,以使其更加全面。我永远不会记住DB API,昨天确实在找同样的东西。
mpdonadio

1

创建“ LIKE”查询时,也可以使用Drupal \ Core \ Database \ Database。由于不推荐使用db_select(),因此这是Drupal 8的替代语法。

$database = Database::getConnection();
$query = $database->select('TABLE NAME', 'u')
    ->fields('u', array('column1','column2'));
$query->condition('column1', '%'.$database->escapeLike($search_phrase) . '%', 'LIKE');

或使用OR查询添加倍数。

$DB_OR = $query->orConditionGroup()
  // find match anywhere in field
  ->condition('column1', '%' . $database->escapeLike($search_phrase) . '%', 'LIKE')

  // find match starting at beginning
  ->condition('column2', $database->escapeLike($search_phrase) . '%', 'LIKE');

  // find match at end of field
  ->condition('column1', '%' . $database->escapeLike($search_phrase), 'LIKE')
$query->condition($DB_OR); // Add OR object as condition
$result = $query->execute();

我更喜欢这种解决方案,因为它使用内置的数据库函数(escapeLike)而不是全局的“ db_like()”。还提到了所有三种可能性。
ssibal '16

1

对于使用“喜欢” db_select如下所示,并为我工作...

$search_value = "testvalue@xmail.com";
$query = db_select('TABLE NAME', 'u');
$query->fields('u', ['ROW1', 'ROW2']);
$query->condition('ROW1', '%' . db_like($search_value) . '%', 'LIKE');
$result = $query->execute();

ROW1中的确切值是“ testvalue@xmail.com”,通过使用LIKE条件,db_select我得到的输出是“ testvalue@xmail.com”。


0

它适用于Drupal8版本1

$exp = "1";
$connection = \Drupal::database();
$query = $connection ->select('node', 'n');
    $query->fields('n');
    $query->condition('nid', '%'.db_like($exp), 'LIKE');
    $records = $query->execute();
foreach ($records as $record) {
ksm($record);
}

版本2

$connection = \Drupal::database();
$query = $connection->query("SELECT *FROM {node} WHERE nid like '%' :nid '%'", [
  ':nid' => "1",
]);
$records = $query->fetchAll();

foreach ($records as $record) {
ksm($record);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.