Як створити умову 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 знайшли рішення на сторінці документації API db_like та SelectQuery: обробник умов док.

Наприклад

$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
Я можу взяти пропуск пізніше сьогодні, щоб зробити це трохи більш вичерпним. Я ніколи не пам'ятаю API DB, і вчора буквально шукав те саме.
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 ()". Також згадуючи всі три можливості.
ssibal

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

він працює у версії 1 Drupal8

$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.