Wie baut man eine LIKE-Bedingung in einer db_select () - Abfrage auf?

14

Wie baut man eine LIKEBedingung in einer db_select()Abfrage auf?

Ich weiß, wie man das mit einem db_query()API-Aufruf macht, aber gibt es eine spezielle Syntax / Methode dafür db_select()?

Anil Sagar
quelle
2
Alles , was Sie db_queryals Platzhalter für Argumente übergeben können, können Sie auch als Argument für zukünftige Verweise übergeben ...Query::condition. Sie finden keine Dokumentation für jeden einzelnen Operator für jeden Abfragetyp, da dies keinen Sinn macht. Alles geht am Ende des Tages durch PDO, wenn db_likeeine Variable korrekt vorbereitet wird db_query, dann wird per Definition dieselbe Variable korrekt vorbereitet fürdb_select
Clive
2
Bevor jemand es vorschlägt, glaube ich nicht, dass wir ein Dup davon haben, es sei denn, Sie können eine Frage zu db_select + LIKE finden. Wir haben db_query + LIKE, aber obwohl die Antwort dieselbe ist, ist die Frage anders.
mpdonadio

Antworten:

21

Nach dem Durchstöbern der Drupal-Dokumentation wurde eine Lösung in der db_like API-Dokumentationsseite und der SelectQuery: Condition- Handler- Dokumentationsseite gefunden .

Beispielsweise

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

Bedingung für eine ähnliche Abfrage ist

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
Anil Sagar
quelle
2
Hier ist zu beachten, dass (1) db_like()erforderlich ist, um das Argument ordnungsgemäß zu umgehen, und (2) dass Sie die Platzhalterzeichen explizit hinzufügen müssen. Es wird auch die Standardkollatierung für die Datenbank verwendet, und ich glaube, es gibt keine Möglichkeit, eine andere anzugeben.
mpdonadio
1
Ich werde es vielleicht später versuchen, dies ein wenig umfassender zu gestalten. Ich kann mich nie an die DB-API erinnern und habe gestern buchstäblich dasselbe nachgeschlagen.
mpdonadio
1

Sie können auch Drupal \ Core \ Database \ Database verwenden, wenn Sie eine "LIKE" -Abfrage erstellen. Dies ist die alternative Drupal 8-Syntax, da db_select () veraltet ist.

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

Oder fügen Sie Mehrfache mit ODER-Abfrage hinzu.

$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
quelle
Ich bevorzuge diese Lösung, da sie die eingebaute Datenbankfunktion (escapeLike) anstelle eines globalen "db_like ()" verwendet. Erwähnen Sie auch alle drei Möglichkeiten.
Ssibal
1

Für die Verwendung von "like" in db_selectist wie folgt und arbeitete für mich ...

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

Hier ist der genaue Wert in ROW1 "[email protected]" und unter Verwendung der LIKEBedingung in habe db_selectich die Ausgabe als "[email protected]" erhalten.

Lakshmi Naresh
quelle
0

es funktioniert in 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
quelle