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

2つ目は無効になり、1つ目は前述の問題を引き起こします。考えや提案はありますか?

ありがとう、パトリック

回答:


15

変化する

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

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

うまくいきました。それをすることは私にも起こりませんでした。
Patrick

3

LOWER()MySQLでは使用が遅いと見なされています。LIKEDrupalのデータベースAPI(DBTNG)では、少なくともMySQLテーブルが* _ci照合の1つを使用するように構成されている場合、大文字と小文字が区別されないため、これも必要ありません。標準のMySQLインストールは* utf8_general_ci *を使用するため、Drupalも使用されます。

したがって、LIKE条件を使用する必要があるだけです。

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

包括的な説明については、条件節を参照してください。

ところで:DBTNGベースのデータベースドライバーは、大文字と小文字を区別しないLIKEの実装を担当します。たとえばPostgreSQLは、include / database / pgsql / database.incで処理される LIKEではなくILIKEを使用します


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クエリの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.