Comment créer une condition LIKE dans une requête db_select ()?


14

Comment créez-vous une LIKEcondition dans une db_select()requête?

Je sais comment faire cela avec un db_query()appel API, mais y a-t-il une syntaxe / méthode spéciale pour le faire db_select()?


2
Juste pour référence future, tout ce que vous pouvez transmettre en db_querytant qu'espace réservé d'argument, vous pouvez également le passer en tant qu'argument ...Query::condition. Vous ne trouverez pas de documentation pour chaque opérateur individuel pour chaque type de requête, car cela n'aurait aucun sens de le faire. Tout passe par PDO à la fin de la journée, si db_likeprépare correctement une variable db_query, alors par définition il préparera correctement la même variable pourdb_select
Clive

2
Avant que quelqu'un ne le suggère, à moins que vous ne trouviez une question sur db_select + LIKE, je ne pense pas que nous ayons un double de cela. Nous avons, db_query + LIKE, mais même si la réponse est la même, la question est différente.
mpdonadio

Réponses:


21

Après avoir fouillé dans la documentation Drupal, j'ai trouvé une solution dans la page de documentation de l'API db_like et SelectQuery: page doc du gestionnaire de conditions .

Par exemple

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

La condition à utiliser pour une requête similaire est

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

2
Les deux choses à noter ici sont que (1) db_like()est nécessaire pour échapper correctement l'argument et (2) vous devez ajouter explicitement les caractères génériques. Il utilisera également le classement par défaut sur la base de données, et je ne pense pas qu'il existe un moyen d'en spécifier un autre.
mpdonadio

1
Je vais peut-être essayer plus tard aujourd'hui de rendre cela un peu plus complet. Je ne me souviens jamais de l'API DB, et je cherchais littéralement la même chose hier.
mpdonadio

1

Vous pouvez également utiliser Drupal \ Core \ Database \ Database lors de la création d'une requête "LIKE". Il s'agit de la syntaxe alternative de Drupal 8 car db_select () est déconseillé.

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

Ou ajoutez des multiples avec la requête OU.

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

Je préfère cette solution, car elle utilise la fonction de base de données intégrée (escapeLike) au lieu d'un "db_like ()" global. Mentionnant également les trois possibilités.
ssibal

1

Pour utiliser "comme" dans db_selectest comme ci-dessous et a fonctionné pour moi ...

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

Ici, la valeur exacte dans ROW1 est "testvalue@xmail.com" et en utilisant la LIKEcondition dans db_selectj'ai obtenu la sortie "testvalue@xmail.com".


0

cela fonctionne dans Drupal8 Version 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);
}

Version 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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.