Menggunakan fungsi SQL dalam kondisi di Drupal 7 db_select ()

9

Saya mencoba untuk menulis suatu kondisi ke klausa WHERE SQL yang memaksa perbandingan kolom ke variabel untuk dibandingkan dalam huruf kecil. Namun fungsi addExpression tidak menyelesaikan ini (karena itu menempatkan ekspresi dalam pemilihan bidang, bukan klausa di mana.

Inilah yang saya coba:

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

Dan ini:

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

Yang kedua menjadi tidak valid dan yang pertama menyebabkan masalah yang saya sebutkan di atas. Ada pemikiran atau saran?

Terima kasih, Patrick

Patrick
sumber

Jawaban:

15

perubahan

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

untuk

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));
xandeadx
sumber
Itu bekerja. Bahkan tidak terpikir oleh saya untuk melakukan itu.
Patrick
3

Penggunaan LOWER()dianggap lambat di MySQL. Itu tidak perlu juga karena LIKEdalam Database API Drupal (DBTNG) tidak sensitif huruf, setidaknya ketika tabel MySQL Anda dikonfigurasi untuk menggunakan salah satu dari kumpulan * _ci. Instalasi standar MySQL menggunakan * utf8_general_ci * dan begitu juga Drupal.

Jadi, Anda hanya perlu menggunakan kondisi LIKE:

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

Lihat Klausa Bersyarat untuk penjelasan komprehensif.

BTW: Driver basis data berbasis DBTNG bertanggung jawab untuk mengimplementasikan SEPERTI kasus yang tidak sensitif. PostgreSQL misalnya menggunakan ILIKE daripada LIKE yang ditangani di include / database / pgsql / database.inc .

Bernhard Fürst
sumber
1

Anda masih dapat menggunakan addExpression.

// Functions - You can use sql functions using addExpression ($expression, $alias = NULL, $arguments = array()).
$query->addExpression('MIN(o.tid)', 'min_term_id');

Sumber daya: Contoh kueri SQL di Drupal 7

ram4nd
sumber