Jak budujesz warunek LIKE w zapytaniu db_select ()?

14

Jak budujesz LIKEwarunek w db_select()zapytaniu?

Wiem jak to zrobić za pomocą db_query()wywołania API, ale czy istnieje specjalna składnia / metoda, aby to zrobić db_select()?

Anil Sagar
źródło
2
Tylko na przyszłość, wszystko , co można przekazać db_queryjako symbol zastępczy argumentu, można również przekazać jako argument ...Query::condition. Nie znajdziesz dokumentacji dla każdego operatora dla każdego rodzaju zapytania, ponieważ nie ma sensu tego robić. Wszystko przechodzi przez PDO pod koniec dnia, jeśli odpowiednio db_likeprzygotuje zmienną db_query, to z definicji przygotuje tę samą zmienną poprawnie dladb_select
Clive
2
Zanim ktokolwiek to zasugeruje, chyba że znajdziesz pytanie dotyczące db_select + LIKE, nie sądzę, że mamy duplikat tego. Mamy, db_query + LIKE, ale mimo że odpowiedź jest taka sama, pytanie jest inne.
mpdonadio

Odpowiedzi:

21

Po wykopaniu przez Drupala Dokumentacji znalazł rozwiązanie w db_like stronie dokumentacji API i SelectQuery: Stan modułu obsługi strony doc ..

Na przykład

$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();

Warunkiem użycia podobnego zapytania jest

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
Anil Sagar
źródło
2
Dwie rzeczy do zauważenia tutaj to, że (1) db_like()jest potrzebne, aby poprawnie uciec przed argumentem, i (2) musisz jawnie dodać znaki wieloznaczne. Będzie również używał domyślnego sortowania w bazie danych i nie sądzę, że istnieje sposób, aby określić inny.
mpdonadio
1
Mogę dzisiaj przyjąć poprawkę, czyniąc to nieco bardziej kompleksowym. Nigdy nie pamiętam DB API i dosłownie szukałem tego samego wczoraj.
mpdonadio
1

Możesz także użyć Drupal \ Core \ Database \ Database podczas tworzenia zapytania „LIKE”. Jest to alternatywna składnia Drupala 8, ponieważ funkcja db_select () jest przestarzała.

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

Lub dodaj wielokrotności za pomocą zapytania 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();
Johann
źródło
Wolę to rozwiązanie, ponieważ korzysta z wbudowanej funkcji bazy danych (escapeLike) zamiast globalnego „db_like ()”. Wymieniając także wszystkie trzy możliwości.
ssibal
1

Używanie „jak” w db_selectjest jak poniżej i działało dla mnie ...

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

Tutaj dokładna wartość w ROW1 to „[email protected]” i używając LIKEwarunku w db_selectotrzymałem wynik jako „[email protected]”.

lakshmi naresh
źródło
0

działa w wersji 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);
}

Wersja 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);
}
JHONATAN DAVID FERNANDEZ ROSA
źródło