SQL işlevlerini Drupal 7'de koşullu kullanma db_select ()


9

Küçük harfle karşılaştırılacak bir değişken için sütun karşılaştırma zorlar bir SQL WHERE yan tümcesi içine bir koşul yazmaya çalışıyorum. Ancak addExpression işlevi bunu başaramaz (çünkü ifadeyi alan seçimine değil, alan seçimine koyar.

İşte ne denedim:

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

Ve bu:

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

İkincisi geçersiz hale gelir ve birincisi yukarıda bahsettiğim soruna neden olur. Herhangi bir düşünce veya öneriniz var mı?

Teşekkürler, Patrick

Yanıtlar:


15

değişiklik

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

için

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

Bu çalışır. Bunu yapmak benim için bile olmadı.
Patrick

3

MySQL'de LOWER()kullanım yavaş sayılır. LIKEDrupal'ın Veritabanı API'sında (DBTNG), en azından MySQL tablonuz * _ci harmanlamalarından birini kullanacak şekilde yapılandırıldığında büyük / küçük harfe duyarlı olmadığından bu da gerekli değildir . Standart bir MySQL kurulumu * utf8_general_ci * kullanır ve Drupal da öyle.

Yani sadece bir LIKE koşulu kullanmanız gerekir:

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

Kapsamlı bir açıklama için Koşullu Maddeler bölümüne bakın .

BTW: DBTNG tabanlı bir veritabanı sürücüsü, büyük / küçük harfe duyarlı olmayan bir LIKE uygulamasından sorumludur. Örneğin PostgreSQL, include / database / pgsql / database.inc içinde işlenen LIKE yerine ILIKE kullanır .


1

Yine de addExpression'u kullanabilirsiniz.

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

Kaynak: Drupal 7'de SQL sorgu örnekleri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.