Drupal 7 db_select () में सशर्त में SQL फ़ंक्शन का उपयोग करना


9

मैं एक SQL WHERE क्लॉज में एक शर्त लिखने की कोशिश कर रहा हूं जो एक चर की तुलना में कॉलम को लोअरकेस में तुलना करने के लिए मजबूर करता है। हालाँकि, addExpression फ़ंक्शन इसे पूरा नहीं कर रहा है (क्योंकि वह अभिव्यक्ति को फ़ील्ड चयन में डाल रहा है, न कि जहां क्लॉज़।

यहाँ मैं कोशिश की है:

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

दूसरा अमान्य हो जाता है और पहले वाला मेरे ऊपर बताई गई समस्या का कारण बनता है। कोई विचार या सुझाव?

धन्यवाद, पैट्रिक

जवाबों:


15

परिवर्तन

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

सेवा

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

यह काम करता है। ऐसा करने के लिए मेरे पास भी नहीं था।
पैट्रिक

3

LOWER()MySQL में उपयोग करना धीमा माना जाता है। यह आवश्यक नहीं है क्योंकि LIKEDrupal के डेटाबेस एपीआई (DBTNG) के मामले में असंवेदनशील है, कम से कम जब आपका MySQL टेबल * _ci collations में से किसी एक का उपयोग करने के लिए कॉन्फ़िगर किया गया हो। एक मानक MySQL अधिष्ठापन * utf8_general_ci * का उपयोग करता है और इसलिए Drupal है।

तो आपको बस एक LIKE शर्त का उपयोग करना होगा:

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

व्यापक स्पष्टीकरण के लिए सशर्त खंड देखें ।

BTW: एक DBTNG आधारित डेटाबेस ड्राइवर एक केस असंवेदनशील LIKE लागू करने के लिए जिम्मेदार है। उदाहरण के लिए PostgreSQL LIKE के बजाय ILIKE का उपयोग करता है जिसे / डेटाबेस / pgsql / database.inc में शामिल किया जाता है ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.