การใช้ฟังก์ชัน SQL ใน conditionals ใน Drupal 7 db_select ()


9

ฉันพยายามเขียนเงื่อนไขลงใน SQL WHERE clause ที่บังคับให้คอลัมน์เปรียบเทียบกับตัวแปรที่จะเปรียบเทียบในตัวพิมพ์เล็ก อย่างไรก็ตามฟังก์ชั่น addExpression ไม่สามารถทำได้ (เนื่องจากเป็นการใส่นิพจน์ในการเลือกฟิลด์ไม่ใช่ส่วนคำสั่งที่

นี่คือสิ่งที่ฉันได้ลอง:

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$query->addExpression("LOWER(ttd.name) = $category");
$result = $query->condition('machine_name', 'images_cat', '=')
    ->execute()
    ->fetchAssoc();

และนี่:

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$result = $query->condition('machine_name', 'images_cat', '=')
    ->condition('LOWER(ttd.name)', $category, '=')
    ->execute()
    ->fetchAssoc();

อันที่สองกลายเป็นโมฆะและอันแรกทำให้เกิดปัญหาที่ฉันกล่าวถึงข้างต้น ความคิดหรือข้อเสนอแนะ?

ขอบคุณแพทริค

คำตอบ:


15

เปลี่ยนแปลง

$query->addExpression("LOWER(ttd.name) = $category");

ถึง

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));

ที่ได้ผล มันไม่ได้เกิดขึ้นกับฉันที่จะทำเช่นนั้น
แพทริค

3

การใช้LOWER()ถือว่าช้าใน MySQL มันก็ไม่จำเป็นเช่นกันเพราะLIKEใน Database API (DBTNG) ของ Drupal นั้นไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กอย่างน้อยเมื่อตาราง MySQL ของคุณถูกกำหนดค่าให้ใช้หนึ่งใน * _ci collations การติดตั้ง MySQL มาตรฐานใช้ * utf8_general_ci * และ Drupal

ดังนั้นคุณเพียงแค่ต้องใช้เงื่อนไข LIKE:

$query->condition('name', $category, 'LIKE');

ดูคำอธิบายเงื่อนไขสำหรับการอธิบายที่ครอบคลุม

BTW: ไดรเวอร์ฐานข้อมูลที่ใช้ DBTNG มีหน้าที่รับผิดชอบในการใช้ LIKE ที่ไม่คำนึงถึงขนาดตัวพิมพ์ PostgreSQL สำหรับการใช้งานอินสแตนซ์ iLike แทน LIKE ซึ่งจะถูกจัดการในรวมถึงฐานข้อมูล / / pgsql / database.inc


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.