كيفية وضع معايير مع الاستعلام المعقد في إطار YII؟

StackOverflow https://stackoverflow.com/questions/4021890

  •  26-09-2019
  •  | 
  •  

سؤال

لدي استعلام مثل هذا:

SELECT * FROM activity
WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))
AND activityType IN(1, 2, 3))
OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))
ORDER BY id DESC;

لقد حاولت استخدام model()->findAllBySql($sql) ويعمل. لكني أريد أن أجعله يستخدم CDbCriteria, ، إذا كان لديك حلول أخرى ، فأخبرني بذلك: د

هل كانت مفيدة؟

المحلول

لا يزال بإمكانك بناء هذا البيان باستخدام cdbcriteria على ما أعتقد ... شيء مثل:

$criteria=new CDbCriteria;
$criteria->condition = '
  (
    (
      userId = 1 OR 
      userId IN (SELECT userId FROM follower WHERE followerId = 1)
    )
    AND activityType IN(1, 2, 3)
  )
  OR (
    targetId = 24 
    AND aType IN(1, 2, 3, 4, 5)
  )
';
$criteria->order = 'id DESC';
$results=Activity::model()->findAll($criteria);

نظرًا لأن هذه النقطة قد تكتب أيضًا عبارة SQL منتظمة ، ولكن قد يكون هناك بعض الفوائد للقيام بذلك بهذه الطريقة: ربط المعايير ، ودمج المعايير ، وإضافة معايير إضافية ، إلخ.

نصائح أخرى

طالما تعمل SQL العادية ، فأنت آمن. هناك عدة مرات عندما يتعين عليّ رمي سجل نشط بعيدًا وأن ينجز المهمة بطريقة OL 'Saner.

حاولت ترجمة هذا الاستعلام إلى بناء cdbcriteria قابل للقراءة. فكرة سيئة. تمتص yii عندما يتعلق الأمر بالاستعلام عن بيانات معقدة.

يمكن العثور على الجواب هنا:http://www.yiiframework.com/doc/guide/1.1/en/database.dao#executing-sql-statements

في حالتك:

$sql = 'SELECT * FROM activity';
$sql .= 'WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))';
$sql .= 'AND activityType IN(1, 2, 3))';
$sql .= 'OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))';
$sql .= 'ORDER BY id DESC';

$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$results = $command->queryAll();

Pestaa على حق أنه في بعض الأحيان يجب عليك إلقاء سجل نشط خارج النافذة. هذا صحيح بشكل خاص إذا كنت تقوم بتحديثات جماعية حيث يكون الحلق عبر العديد من النماذج غير فعال بشكل فظيع.

فقط استخدم csqldataproviderhttp://www.yiiframework.com/doc/api/1.1/csqldataprovider

إخلاء المسئولية: أعرف أنها ليست إجابة دقيقة على هذا السؤال الجمعي ، لكنها قد تساعد في العمل على المشكلة التي تم تقديمها. أظن أن الغرض الرئيسي من هذا السؤال هو الحصول على وسيلة لاستخدام CgridView ، Clistview وما إلى ذلك مع SQL التعسفي.

أنا أستعمل CDbCriteria للاستعلامات المعقدة التي أستخدم فيها with خاصية.

يمكنك بناء معايير معقدة مثل هذا:

$dbCriteria->with=array(
   '<relation1>'=>array( 'condition'=>'<condition for given relation>',
        'with'=>array('<relation2:relation of relation1>'
            =>array(<conditions for relation2>)
        )
        'scopes'=><scopes for relation1>
    )
);

لم أتحقق من كيفية OR يمكن أن تلعب هنا.

باستخدام النطاقات ، يمكنك أيضًا إدراج بعض المعايير الأكثر تعقيدًا والاحتفاظ بحالة البحث الخاصة بك قابلة للقراءة.

هذا قوي جدا. لم أر "تعليميًا" كاملًا حول هذا بعد ؛ لقد انتهيت من هذا من رمز المصدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top