Yii 使用CDBC标准进行搜索

Yii 使用CDBC标准进行搜索,yii,Yii,有没有办法在我选择的字段中进行CDbCriteria搜索(如compare()),但使用模型的search()方法,而不必手动添加compare()条件 请注意,我的目标是找到一个解决方案,让我写更少的行,不多也不少。因此,如果解决方案真的很粗糙和/或复杂,我就选择“add-a-move-compares()”方法 我当前的代码: $criteria = new CDbCriteria; $criteria->with = array('A', 'B', 'C', 'D', 'E');

有没有办法在我选择的字段中进行CDbCriteria搜索(如
compare()
),但使用模型的
search()
方法,而不必手动添加
compare()
条件

请注意,我的目标是找到一个解决方案,让我写更少的行,不多也不少。因此,如果解决方案真的很粗糙和/或复杂,我就选择“add-a-move-compares()”方法

我当前的代码:

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

更新:看来您(从下面的回答中)需要进行部分匹配,因此您必须将
true
传递给您的
比较
调用:

$criteria->compare(“A.field1”、“test”、“true”或“);
甚至可以将其传递到
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()
方法。不过,还有其他选择,例如,您可以使用:

$criteria=新的CDBC标准;
$criteria->with=array('A','B','C','D','E');
$criteria->together=true;//您需要将这些表连接在一起,以便在同一查询中联接其他表
$criteria->addCondition('A.field1=“test”'、'OR');
$criteria->addCondition('A.field2=“test”'、'OR');
//等等
我建议继续上面的内容,因为当您希望“智能地”确定用于比较的运算符时,实际上应该使用
compare
,例如:如果您从用户输入中获取测试值,并且允许用户使用运算符(,condition='A.field1=“test”或A.field2=“test”); //如果您使用params,甚至更好 $criteria->condition='A.field1=:test1或A.field2=:test2或B.field1=:test3或B.field2=:test3'; $criteria->params=array( ':test1'=>test', ':test2'=>“另一个测试”, 'test3'=>'tests'//省略':'这里的参数也适用 );
模型的
搜索()
返回一个数据提供程序,您想要一个数据提供程序吗?另外,添加您当前的代码可能有助于了解您的确切需求。不,因为我正在查看不止一个型号,也就是说,select不是一个简单的
select*FROM tA
,而是一个复杂的从5个表中选择。好的,现在我认为尝试使用ea将是一个巨大的挑战ch模型的搜索(),不确定是否可能。好的,我坚持另一种方法。我不打算比较10多个字段。我只是在寻找一种更聪明的方法。谢谢!从您当前的代码来看,您似乎只是在检查是否相等。因为
条件
添加条件
是更好的选择,所以请继续。我实际上正在处理一个“搜索”字段,因此
WHERE
看起来更像
field1,像“%something%”…
。我想知道是否有一种方法可以让Yii比较字符串,而不是让MySQL比较字符串。我这样问是因为这种方法应该可以实现模糊字符串匹配。因为MySQL不支持fuzzy字符串匹配,对吗?更进一步,无序字符串匹配,也就是“这是一个测试”==“这是一个测试”好的,但是要得到像%something%这样的
,你必须在比较中通过
true
,但是你通过的是
false
,这让我假设你只是在检查
=something
。无论如何,如果你的意思是与regexp进行模糊字符串匹配,那么(尽管我还没有做过类似的事情,很遗憾)。当然,对于无序字符串匹配,您需要
%
,为此,您肯定需要通过
进行比较。模糊字符串匹配意味着匹配几乎相等的字符串,例如,“这是一个测试”=“这是一个测试”。关于无序匹配,like和%应该如何帮助我?“此%is%a%test”与“a%test%This%is”不匹配。哦,抱歉,我以为您要匹配包含“test”的字符串相反。无论如何,我给出了
的例子,比如“%something%”
,因为您在之前的评论中说这就是您要搜索的内容。对于fuzzy,您可以使用regexp,我不确定无序