كيفية وضع معايير مع الاستعلام المعقد في إطار YII؟
سؤال
لدي استعلام مثل هذا:
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
يمكن أن تلعب هنا.
باستخدام النطاقات ، يمكنك أيضًا إدراج بعض المعايير الأكثر تعقيدًا والاحتفاظ بحالة البحث الخاصة بك قابلة للقراءة.
هذا قوي جدا. لم أر "تعليميًا" كاملًا حول هذا بعد ؛ لقد انتهيت من هذا من رمز المصدر.