我有一系列文字。
$terms = array('bars', 'bar', 'fun');
我正在尝试查找包含每个单词的所有记录。
TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms)));
不确定在阵列中找到所有内容的正确方法。
答案 0 :(得分:1)
您可以在CDbCriteria
这样的
findAll
类进行此类查询
$terms = array('bars', 'bar', 'fun');
$criteria = new CDbCriteria
$criteria->compare('name',$terms,true,"AND",true);
TableName::model()->findAll($criteria);
有关详细信息,请参阅compare文档
答案 1 :(得分:1)
Manquer's answer对您的具体情况是正确的。但是,由于compare
(读取源Luke )的实现,它不适用于部分搜索,即LIKE '%ADF%'
。为此,您可以遍历数组并使用compare
添加每个元素:
$c1=new CDbCriteria;
foreach($terms as $txt){
$c1->compare('name',$txt,true,'OR');
}
TableName::model()->findAll($c1);
但是,如果你需要为另一个组添加另一个条件,那么由于compare
创建查询的方式,结果可能不符合预期,你可能最终会遇到
WHERE ((((type=1) OR (name LIKE '%ABC%')) OR (name LIKE '%RET%')) OR (name LIKE '%Anything else%'))
为避免这种情况,您有以下几种选择:
专门为您的数组值创建另一个条件对象,并使用CDbCriteria::merge()
将其合并到另一个对象中:
$c1=new CDbCriteria; // original criteria
$c2=new CDbCriteria; // criteria for handling our search values
foreach($terms as $txt){
$c2->compare('name',$txt,true,'OR');
}
$c1->mergeWith($c2); // Merge $c2 into $c1
专门为您的数组值创建另一个条件对象,并使用CDbCriteria::addCondition()
手动将此条件添加到另一个对象中:
$c1=new CDbCriteria; // original criteria
$c2=new CDbCriteria; // criteria for handling our search values
foreach($terms as $txt){
$c2->compare('name',$txt,true,'OR');
}
$c1->addCondition($c->condition); // Merge $c2 into $c1
$c1->params+=$c2->params; // Add the params for $c2 into $c1
使用(2)。