คุณจะสร้างเงื่อนไข LIKE ในแบบสอบถาม db_select () ได้อย่างไร


14

คุณจะสร้างLIKEเงื่อนไขในdb_select()แบบสอบถามได้อย่างไร

ฉันรู้วิธีการทำสิ่งนี้ด้วยการdb_query()เรียก API แต่มีไวยากรณ์ / วิธีพิเศษสำหรับทำสิ่งนี้ด้วยdb_select()หรือไม่


2
สำหรับการอ้างอิงในอนาคตอะไรก็ตามที่คุณสามารถส่งผ่านไปdb_queryเป็นตัวยึดตำแหน่งอาร์กิวเมนต์คุณสามารถส่งผ่านข้อโต้แย้งไป...Query::conditionได้ คุณจะไม่พบเอกสารสำหรับผู้ประกอบการแต่ละรายสำหรับการสืบค้นแต่ละประเภทที่แตกต่างกันเนื่องจากไม่มีเหตุผลที่จะทำเช่นนั้น ทุกอย่างต้องผ่าน PDO ในตอนท้ายของวันหากdb_likeมีการจัดเตรียมตัวแปรอย่างถูกต้องdb_queryแล้วโดยคำจำกัดความมันจะเตรียมตัวแปรเดียวกันอย่างถูกต้องสำหรับdb_select
Clive

2
ก่อนที่ใครจะแนะนำมันเว้นแต่คุณจะพบคำถามเกี่ยวกับ db_select + LIKE ฉันไม่คิดว่าเรามีซ้ำ เรามี db_query + LIKE แต่ถึงแม้ว่าคำตอบจะเหมือนกัน แต่คำถามก็แตกต่างกัน
mpdonadio

คำตอบ:


21

หลังจากขุดผ่าน Drupal Documentation พบวิธีแก้ปัญหาในหน้าเอกสารคู่มือ db_like API และSelectQuery:หน้า doc Handler condition ..

ตัวอย่างเช่น

$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
สิ่งที่ควรสังเกตสองประการdb_like()คือต้องใช้(1) เพื่อหลีกเลี่ยงการโต้แย้งอย่างถูกต้องและ (2) คุณต้องเพิ่มอักขระไวด์การ์ดอย่างชัดเจน มันจะใช้การเรียงหน้าเริ่มต้นบนฐานข้อมูลและฉันไม่คิดว่าจะมีวิธีใดในการระบุอีกวิธีหนึ่ง
mpdonadio

1
ฉันอาจใช้เวลาผ่านไปในวันนี้เพื่อทำให้สิ่งนี้ครอบคลุมมากขึ้นเล็กน้อย ฉันไม่สามารถจำ DB API ได้และกำลังค้นหาสิ่งเดียวกันเมื่อวานนี้
mpdonadio

1

คุณยังสามารถใช้ Drupal \ Core \ Database \ Database เมื่อสร้างแบบสอบถาม "LIKE" นี่คือไวยากรณ์สำรอง Drupal 8 เนื่องจาก db_select () เลิกใช้แล้ว

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

ฉันชอบโซลูชันนี้เนื่องจากใช้ฟังก์ชันฐานข้อมูลในตัว (escapeLike) แทนที่จะเป็น "db_like ()" แบบโกลบอล ยังกล่าวถึงทั้งสามความเป็นไปได้
ssibal

1

สำหรับการใช้ "like" in 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.