it-swarm.asia

استخدام دالات SQL في الشروط في Drupal 7 db_select ()

أحاول كتابة شرط في عبارة 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();

الثاني يصبح باطلاً والأول يسبب المشكلة التي ذكرتها أعلاه. أي أفكار أو اقتراحات؟

شكرا باتريك

9
Patrick

يتغيرون

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

إلى

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

يعتبر استخدام LOWER() بطيئًا في MySQL. هذا ليس ضروريًا أيضًا لأن LIKE في قاعدة بيانات قاعدة بيانات دروبال (DBTNG) غير حساسة لحالة الأحرف ، على الأقل عندما يتم تكوين جدول MySQL الخاص بك لاستخدام أحد عمليات ترتيب * _ci. يستخدم تثبيت MySQL القياسي * utf8_general_ci * وكذلك دروبال.

لذلك تحتاج فقط إلى استخدام شرط LIKE:

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

انظر الشروط الشرطية للحصول على شرح شامل.

راجع للشغل: يعتبر برنامج تشغيل قاعدة البيانات المستندة إلى DBTNG مسؤولاً عن تطبيق LIKE غير حساسة لحالة الأحرف. تستخدم PostgreSQL على سبيل المثال ILIKE بدلاً من LIKE الذي يتم التعامل معه في يتضمن/database/pgsql/database.inc .

3
Bernhard Fürst

لا يزال بإمكانك استخدام addExpression.

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

المصدر: أمثلة استعلام SQL في Drupal 7

1
ram4nd