Bir db_select () sorgusunda bir LIKE koşulu nasıl oluştururum?


14

Nasıl bir yukarı yaratırım LIKEbir de koşul db_select()sorguda?

Bunu bir db_query()API çağrısı ile nasıl yapacağımı biliyorum , ama bunu yapmak için özel bir sözdizimi / yöntem var db_select()mı?


2
Sadece ileride başvurmak için, bağımsız değişken yer tutucu olarak iletebileceğiniz her şeyi , db_querybağımsız değişken olarak da iletebilirsiniz ...Query::condition. Bunu yapmak anlamlı olmayacağından, her farklı türde sorgu için her bir işleç için belge bulamazsınız. Her şey günün sonunda PDO'dan geçer, eğer db_likebir değişkeni doğru bir şekilde hazırlarsa db_query, tanım gereği aynı değişkeni doğru bir şekilde hazırlayacaktırdb_select
Clive

2
Db_select + LIKE hakkında soru bulamadığınız sürece, kimse önermezse, bunun bir kopyası olduğunu sanmıyorum. Biz db_query + LIKE var, ama cevap aynı olsa da, soru farklı.
mpdonadio

Yanıtlar:


21

Drupal Documentation üzerinden kazdıktan sonra db_like API dokümantasyon sayfasında ve SelectQuery: koşul işleyici doküman sayfasında bir çözüm bulundu .

Örneğin

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

Benzer sorgu için kullanılacak koşul:

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

2
Burada dikkat db_like()edilmesi gereken iki şey, (1) argümanından düzgün bir şekilde kaçmak için gerekli olması ve (2) joker karakterleri açıkça eklemeniz gerektiğidir. Ayrıca veritabanında varsayılan harmanlama kullanır ve farklı bir belirtmek için herhangi bir yolu olduğunu sanmıyorum.
mpdonadio

1
Bugün bunu biraz daha kapsamlı hale getirmek için geçebilirim. Asla DB API hatırlayamıyorum ve kelimenin tam anlamıyla dün aynı şeyi arıyordu.
mpdonadio

1

"LIKE" sorgusu oluştururken Drupal \ Core \ Database \ Database'i de kullanabilirsiniz. Db_select () kullanımdan kaldırıldığı için bu Drupal 8 alternatif sözdizimidir.

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

Veya OR sorgusuyla katları ekleyin.

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

Küresel bir "db_like ()" yerine yerleşik veritabanı işlevini (escapeLike) kullandığından, bu çözümü tercih ederim. Ayrıca üç olasılıktan da bahsediyoruz.
ssibal

1

"Gibi" kullanmak db_selectiçin aşağıdaki gibidir ve benim için çalıştı ...

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

Burada ROW1 tam değeri "testvalue@xmail.com" ve LIKEkoşul kullanarak db_select"çıktı" testvalue@xmail.com "çıktı.


0

Drupal8 Sürüm 1'de çalışır

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

Versiyon 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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.