¿Cómo se crea una condición LIKE en una consulta db_select ()?


14

¿Cómo se genera una LIKEcondición en una db_select()consulta?

Sé cómo hacer esto con una db_query()llamada API, pero ¿hay una sintaxis / método especial para hacerlo db_select()?


2
Solo para referencia futura, cualquier cosa que pueda pasar db_querycomo marcador de posición de argumento, también puede pasar como argumento a ...Query::condition. No encontrará documentación para cada operador individual para cada tipo diferente de consulta, ya que no tendría sentido hacerlo. Todo pasa por DOP al final del día, si db_likeprepara una variable correctamente para db_query, entonces, por definición, preparará la misma variable correctamente paradb_select
Clive

2
Antes de que alguien lo sugiera, a menos que pueda encontrar preguntas sobre db_select + LIKE, no creo que tengamos un duplicado de esto. Tenemos, db_query + LIKE, pero aunque la respuesta es la misma, la pregunta es diferente.
mpdonadio

Respuestas:


21

Después de explorar Drupal Documentation, encontramos una solución en la página de documentación de la API db_like y en SelectQuery: página del documento del controlador de condiciones .

Por ejemplo

$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 condición a usar para una consulta similar es

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

2
Las dos cosas a tener en cuenta aquí son que (1) db_like()es necesario para escapar adecuadamente del argumento, y (2) debe agregar explícitamente los caracteres comodín. También usará la intercalación predeterminada en la base de datos, y no creo que haya ninguna forma de especificar una diferente.
mpdonadio

1
Puedo tomar un pase más tarde hoy para hacer esto un poco más completo. Nunca recuerdo la API de DB, y literalmente estaba buscando lo mismo ayer.
mpdonadio

1

También puede usar Drupal \ Core \ Database \ Database al crear una consulta "LIKE". Esta es la sintaxis alternativa de Drupal 8 ya que db_select () está en desuso.

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

O agregue múltiplos con consulta 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();

Prefiero esta solución, ya que está utilizando la función de base de datos integrada (escapeLike) en lugar de un "db_like ()" global. También mencionando las tres posibilidades.
ssibal

1

Para usar "me gusta" en db_selectes como a continuación y funcionó para mí ...

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

Aquí el valor exacto en ROW1 es "testvalue@xmail.com" y al usar la LIKEcondición db_selectobtuve el resultado como "testvalue@xmail.com".


0

funciona en la versión 1 de 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);
}

Versión 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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.