Comment créez-vous une LIKE
condition 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()
?
Comment créez-vous une LIKE
condition 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()
?
Réponses:
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')
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.
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();
Pour utiliser "comme" dans db_select
est 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 LIKE
condition dans db_select
j'ai obtenu la sortie "testvalue@xmail.com".
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);
}
db_query
tant 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, sidb_like
prépare correctement une variabledb_query
, alors par définition il préparera correctement la même variable pourdb_select