Sử dụng các hàm SQL trong các điều kiện trong Drupal 7 db_select ()


9

Tôi đang cố gắng viết một điều kiện vào mệnh đề WHERE của SQL để buộc so sánh cột với một biến được so sánh bằng chữ thường. Tuy nhiên, hàm addExpression không thực hiện được điều này (vì đó là đặt biểu thức trong vùng chọn, không phải là mệnh đề where.

Đây là những gì tôi đã thử:

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

Và cái này:

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

Cái thứ hai trở nên không hợp lệ và cái thứ nhất gây ra vấn đề tôi đã đề cập ở trên. Bất kỳ suy nghĩ hoặc đề nghị?

Cảm ơn, Patrick

Câu trả lời:


15

thay đổi

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

đến

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

Điều đó làm việc. Nó thậm chí không xảy ra với tôi để làm điều đó.
Patrick

3

Sử dụng LOWER()được coi là chậm trong MySQL. Điều đó cũng không cần thiết vì LIKEtrong API cơ sở dữ liệu (DBTNG) của Drupal không phân biệt chữ hoa chữ thường, ít nhất là khi bảng MySQL của bạn được cấu hình để sử dụng một trong các đối chiếu * _ci. Một bản cài đặt MySQL tiêu chuẩn sử dụng * utf8_general_ci * và Drupal cũng vậy.

Vì vậy, bạn chỉ cần sử dụng một điều kiện THÍCH:

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

Xem các điều kiện có điều kiện để giải thích toàn diện.

BTW: Trình điều khiển cơ sở dữ liệu dựa trên DBTNG chịu trách nhiệm triển khai một trường hợp THÍCH không nhạy cảm. Ví dụ, PostgreSQL sử dụng ILIKE thay vì THÍCH, được xử lý trong tệp bao gồm / cơ sở dữ liệu / pssql / cơ sở dữ liệu .


1

Bạn vẫn có thể sử dụng addExpression.

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

Tài nguyên: Ví dụ truy vấn SQL trong Drupal 7

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.