有没有办法在我选择的字段中进行CDbCriteria搜索(如在compare()
中),但使用模型的search()
方法而不必手动添加compare()
条件?
请注意,我的目标是提供一种解决方案,让我可以编写更少的行,不多也不少。所以,如果解决方案真的很丑陋和/或那些mesy,我只会选择“add-a-few-comparison()”方法。
我目前的代码:
$criteria = new CDbCriteria;
$criteria->with = array('A', 'B', 'C', 'D', 'E');
$criteria->compare("A.field1", "test", false, 'OR');
$criteria->compare("A.field2", "test", false, 'OR');
$criteria->compare("B.field1", "test", false, 'OR');
$criteria->compare("B.field2", "test", false, 'OR');
$dataProvider = new CActiveDataProvider('Z', array(
'criteria'=>$criteria,
//pagination...
//more options...
));
答案 0 :(得分:2)
更新:对于部分匹配,您似乎是actually looking(来自此答案的评论),为此,您必须将true
传递给compare
1}}来电:
$criteria->compare("A.field1", "test", true, 'OR');
即便如此,也可以传递给addCondition
:
$criteria->addCondition('A.field1 LIKE "%test"','OR');
// or with params as below
$criteria->addCondition('A.field2 LIKE :test','OR');
$criteria->params=array(
':test'=>'%test%',
);
正如我在评论中已经提到的,我认为不可能使用每个模型的默认search()
方法。还有其他选择,例如,您可以使用addCondition
instead:
$criteria = new CDbCriteria;
$criteria->with = array('A', 'B', 'C', 'D', 'E');
$criteria->together = true; // you'll need together so that the other tables are joined in the same query
$criteria->addCondition('A.field1 = "test"','OR');
$criteria->addCondition('A.field2 = "test"','OR');
// and so on
我建议使用上述内容,因为compare
(doc-link)实际上应该用于您想要“智能地”确定算子进行比较的情况,例如:如果您正在参加测试来自用户输入和用户的值被允许使用运算符(<,>,< = etc)。确定要在条件中使用的运算符后,compare
会相应地调用其他函数,包括addCondition
。因此,使用addCondition
将至少避免那些不必要的检查。
此外,如果您只需检查相等性,即如果您的sql WHERE
应该是:
WHERE A.field1 = "test" OR A.field2 = "test"
那么您甚至不需要addCondition
,而只需使用更复杂的condition
(doc):
$criteria->condition='A.field1 = "test" OR A.field2 = "test"';
// or even better if you use params
$criteria->condition='A.field1 =:test1 OR A.field2 =:test2 OR B.field1 =:test3 OR B.field2 =:test3';
$criteria->params=array(
':test1'=>'test',
':test2'=>'anothertest',
'test3'=>'tests' // omitting ':' here for params also works
);