Come si crea una condizione LIKE in una query db_select ()?


14

Come si crea una LIKEcondizione in una db_select()query?

So come fare questo con una db_query()chiamata API, ma esiste una sintassi / metodo speciale per farlo db_select()?


2
Solo per riferimento futuro, tutto ciò a cui puoi passare db_querycome segnaposto di argomento, puoi anche passare come argomento a ...Query::condition. Non troverai documentazione per ogni singolo operatore per ogni diverso tipo di query, poiché non avrebbe senso farlo. Alla fine della giornata passa tutto attraverso la DOP, se db_likeprepara correttamente una variabile db_query, per definizione preparerà correttamente la stessa variabile perdb_select
Clive

2
Prima che qualcuno lo suggerisca, a meno che tu non riesca a trovare una domanda su db_select + LIKE, non credo che ne abbiamo una copia. Abbiamo, db_query + LIKE, ma anche se la risposta è la stessa, la domanda è diversa.
mpdonadio

Risposte:


21

Dopo aver esaminato la documentazione di Drupal, ho trovato una soluzione nella pagina di documentazione dell'API db_like e in SelectQuery: pagina del documento del gestore delle condizioni .

Per esempio

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

Condizione da utilizzare per query simili è

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

2
Le due cose da notare qui sono che (1) db_like()è necessario per sfuggire correttamente all'argomento e (2) è necessario aggiungere esplicitamente i caratteri jolly. Utilizzerà anche le regole di confronto predefinite nel database e non credo che ci sia alcun modo per specificarne uno diverso.
mpdonadio

1
Oggi potrei fare un passaggio per renderlo un po 'più completo. Non ricordo mai l'API DB e ieri ho letteralmente cercato la stessa cosa.
mpdonadio

1

È inoltre possibile utilizzare Drupal \ Core \ Database \ Database durante la creazione di query "LIKE". Questa è la sintassi alternativa di Drupal 8 poiché db_select () è obsoleto.

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

Oppure aggiungi multipli con query 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();

Preferisco questa soluzione, poiché utilizza la funzione di database integrata (escapeLike) anziché un "db_like ()" globale. Menzionando anche tutte e tre le possibilità.
ssibal,

1

Per usare "mi piace" in db_selectè come sotto e ha funzionato per me ...

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

Qui il valore esatto in ROW1 è "testvalue@xmail.com" e usando la LIKEcondizione in db_selectho ottenuto l'output come "testvalue@xmail.com".


0

funziona in Drupal8 versione 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);
}

Versione 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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.