我有一个单词数组。
$terms = array('bars', 'bar', 'fun');
我正在尝试查找包含每个单词的所有记录。
TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms)));
不确定查找数组中所有内容的正确方法。
最佳答案
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)。
关于php - MySQL 与字符串数组类似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100691/