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()?

Anil Sagar
la source
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')
Anil Sagar
la source
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();
Johann
la source
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 = "[email protected]";
$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 "[email protected]" et en utilisant la LIKEcondition dans db_selectj'ai obtenu la sortie "[email protected]".

lakshmi naresh
la source
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);
}
JHONATAN DAVID FERNANDEZ ROSA
la source