在Drupal 7 db_select()中的条件条件中使用SQL函数


9

我正在尝试将条件写入SQL WHERE子句中,以强制将列比较与要以小写形式进行比较的变量进行比较。但是,addExpression函数并不能完成此操作(因为这是将表达式放入字段选择中,而不是where子句中。

这是我尝试过的:

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

第二个无效,第一个导致我上面提到的问题。有什么想法或建议吗?

谢谢,帕特里克

Answers:


15

更改

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

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

那个有效。我什至没有想到要这样做。
Patrick

3

LOWER()在MySQL中,使用速度较慢。也没有必要,因为LIKE在Drupal的数据库API(DBTNG)中不区分大小写,至少在将MySQL表配置为使用* _ci归类之一的情况下。标准的MySQL安装使用* utf8_general_ci *,Drupal也是如此。

因此,您只需要使用LIKE条件即可:

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

有关详细说明,请参见条件条款

顺便说一句:基于DBTNG的数据库驱动程序负责实现不区分大小写的LIKE。例如,PostgreSQL使用ILIKE而不是包含include / database / pgsql / database.inc中的LIKE 。


1

您仍然可以使用addExpression。

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

资源:Drupal 7中的SQL查询示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.