Как создать условие LIKE в запросе db_select ()?


14

Как вы строите LIKEусловие в db_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

Ответы:


21

После изучения Drupal Documentation было найдено решение на странице документации по API db_like и на странице документации по обработчику условий .

Например

$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

Вы также можете использовать Drupal \ Core \ Database \ Database при создании запроса "LIKE". Это альтернативный синтаксис Drupal 8, поскольку db_select () устарела.

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

Или добавить кратные с запросом ИЛИ.

$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 ()". Также упомяну все три возможности.
Сибирь

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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.