Como você cria uma condição LIKE em uma consulta db_select ()?

14

Como você cria uma LIKEcondição em uma db_select()consulta?

Eu sei como fazer isso com uma db_query()chamada de API, mas existe uma sintaxe / método especial para fazer isso db_select()?

Anil Sagar
fonte
2
Apenas para referência futura, qualquer coisa para a qual você possa passar db_querycomo um espaço reservado para argumento, também pode passar como um argumento para ...Query::condition. Você não encontrará documentação para cada operador individual para cada tipo diferente de consulta, pois não faria sentido fazer isso. Tudo passa pelo DOP no final do dia, se db_likeprepara uma variável corretamente para db_query, então, por definição, prepara a mesma variável corretamente paradb_select
Clive
2
Antes que alguém o sugira, a menos que você possa encontrar uma pergunta sobre db_select + LIKE, acho que não temos dúvida disso. Temos db_query + LIKE, mas mesmo que a resposta seja a mesma, a pergunta é diferente.
mpdonadio

Respostas:

21

Depois de cavar através de documentação Drupal encontrada uma solução em db_like página de documentação da API e SelectQuery: condição página doc manipulador ..

Por exemplo

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

A condição a ser usada para consulta semelhante é

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
Anil Sagar
fonte
2
As duas coisas a serem observadas aqui são que (1) db_like()é necessário para escapar adequadamente do argumento e (2) você precisa adicionar explicitamente os caracteres curinga. Ele também usará o agrupamento padrão no banco de dados, e não acho que exista nenhuma maneira de especificar um agrupamento diferente.
mpdonadio
1
Hoje, posso dar um passe hoje para tornar isso um pouco mais abrangente. Nunca me lembro da API do banco de dados e estava literalmente pesquisando a mesma coisa ontem.
mpdonadio
1

Você também pode usar Drupal \ Core \ Database \ Database ao criar a consulta "LIKE". Esta é a sintaxe alternativa do Drupal 8, já que db_select () está obsoleto.

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

Ou adicione múltiplos com a 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();
Johann
fonte
Eu prefiro esta solução, pois está usando a função de banco de dados incorporada (escapeLike) em vez de um "db_like ()" global. Também mencionando todas as três possibilidades.
ssibal
1

Para usar "like" em db_selecté como abaixo e trabalhou para mim ...

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

Aqui o valor exato em ROW1 é "[email protected]" e, usando a LIKEcondição em db_select, obtive a saída como "[email protected]".

lakshmi naresh
fonte
0

funciona na versão 1 do 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);
}

Versão 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
fonte