Bagaimana Anda membangun kondisi LIKE dalam kueri db_select ()?

14

Bagaimana Anda membangun LIKEkondisi dalam db_select()kueri?

Saya tahu bagaimana melakukan ini dengan db_query()panggilan API, tetapi apakah ada sintaks / metode khusus untuk melakukan ini db_select()?

Anil Sagar
sumber
2
Hanya untuk referensi di masa mendatang, apa pun yang dapat Anda lewati db_querysebagai tempat penampung argumen, Anda juga dapat meneruskan sebagai argumen ...Query::condition. Anda tidak akan menemukan dokumentasi untuk setiap operator untuk setiap jenis kueri yang berbeda, karena tidak masuk akal untuk melakukan itu. Semuanya berjalan melalui PDO pada akhir hari, jika db_likemenyiapkan variabel dengan benar db_query, maka dengan definisi itu akan menyiapkan variabel yang sama dengan benar untukdb_select
Clive
2
Sebelum ada yang menyarankan, kecuali Anda dapat menemukan pertanyaan tentang db_select + LIKE, saya rasa kami tidak memiliki duplikat ini. Kami punya, db_query + LIKE, tetapi meskipun jawabannya sama, pertanyaannya berbeda.
mpdonadio

Jawaban:

21

Setelah menggali melalui Dokumentasi Drupal menemukan solusi di db_like halaman dokumentasi API dan SelectQuery: kondisi handler halaman doc ..

Sebagai contoh

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

Kondisi yang digunakan untuk permintaan serupa adalah

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
Anil Sagar
sumber
2
Dua hal yang perlu diperhatikan di sini adalah (1) db_like()diperlukan untuk keluar dari argumen, dan (2) Anda perlu menambahkan karakter wildcard secara eksplisit. Ini juga akan menggunakan susunan standar pada database, dan saya tidak berpikir ada cara untuk menentukan yang berbeda.
mpdonadio
1
Saya mungkin mengambil lulus hari ini untuk membuat ini sedikit lebih komprehensif. Saya tidak pernah dapat mengingat DB API, dan benar-benar mencari hal yang sama kemarin.
mpdonadio
1

Anda juga dapat menggunakan Drupal \ Core \ Database \ Database saat membuat kueri "LIKE". Ini adalah sintaks alternatif Drupal 8 karena db_select () tidak digunakan lagi.

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

Atau tambahkan beberapa dengan kueri ATAU.

$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
sumber
Saya lebih suka solusi ini, karena menggunakan fungsi basis data bawaan (escapeLike) daripada global "db_like ()". Juga menyebutkan ketiga kemungkinan.
ssib
1

Untuk menggunakan "like" di db_selectadalah seperti di bawah ini dan berfungsi untuk saya ...

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

Di sini nilai tepat di ROW1 adalah "[email protected]" dan dengan menggunakan LIKEkondisi di db_selectsaya mendapat output sebagai "[email protected]".

lakshmi naresh
sumber
0

ini berfungsi di Drupal8 Versi 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);
}

Versi 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
sumber