db_select()クエリでLIKE条件をどのように構築しますか?


14

クエリのLIKE条件をどのように構築しdb_select()ますか?

私はdb_query()API呼び出しでこれを行う方法を知っていますが、これを行うための特別な構文/メソッドはありますdb_select()か?


2
将来の参照のために、引数プレースホルダーとして渡すことができるものなら何でもdb_query、引数として渡すこともできます...Query::condition。クエリの種類ごとに個別の演算子のドキュメントを見つけることはできません。それは意味がありません。それはすべて1日の終わりにPDOを通過しdb_like、変数を正しく準備する場合db_query、定義により同じ変数を正しく準備しますdb_select
Clive

2
誰かがそれを提案する前に、db_select + LIKEについての質問を見つけられない限り、私たちはこれの二重を持っているとは思わない。db_query + LIKEがありますが、答えは同じですが、質問は異なります。
mpdonadio

回答:


21

Drupalドキュメントを掘り下げた後、db_like APIドキュメントページとSelectQuery:condition handlerドキュメントページで解決策が見つかりました。

例えば

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

類似クエリに使用する条件は

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

2
ここで注意すべき2つの点は、(1)db_like()引数を適切にエスケープするために必要なこと、および(2)ワイルドカード文字を明示的に追加する必要があることです。また、データベースのデフォルトの照合を使用しますが、別の照合を指定する方法はないと思います。
mpdonadio

1
これをもう少し包括的にするために、本日後半にパスを取るかもしれません。DB APIを思い出すことはできず、昨日も文字通り同じものを探していました。
mpdonadio

1

「LIKE」クエリを作成するときにDrupal \ Core \ Database \ Databaseを使用することもできます。db_select()は推奨されないため、これはDrupal 8の代替構文です。

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

または、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();

グローバルな「db_like()」の代わりに組み込みのデータベース関数(escapeLike)を使用しているため、このソリューションを好みます。また、3つの可能性すべてに言及します。
ssibal

1

「のように」を使用することdb_selectは以下の通りであり、私のために働いた...

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

ここで、ROW1の正確な値は「testvalue@xmail.com」であり、LIKE条件を使用しdb_selectて「testvalue@xmail.com」として出力されました。


0

Drupal8バージョン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);
}

バージョン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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.