Php 类似MySQL的字符串数组
我有一大堆单词Php 类似MySQL的字符串数组,php,yii,Php,Yii,我有一大堆单词 $terms = array('bars', 'bar', 'fun'); 我试图找到包含每个单词的所有记录 TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms))); 不确定查找数组中所有内容的正确方法。您可以在findAll中使用CDbCriteria类进行此类查询,如下所示 $terms = array('bars', 'bar', 'fun');
$terms = array('bars', 'bar', 'fun');
我试图找到包含每个单词的所有记录
TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms)));
不确定查找数组中所有内容的正确方法。您可以在
findAll
中使用CDbCriteria
类进行此类查询,如下所示
$terms = array('bars', 'bar', 'fun');
$criteria = new CDbCriteria
$criteria->compare('name',$terms,true,"AND",true);
TableName::model()->findAll($criteria);
有关详细信息,请参阅文档是否适合您的具体情况。但是,由于(读取源代码)的实现,它将不适用于部分搜索,即像“%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()
:
CDbCriteria::addCondition()
将此条件手动添加到另一个对象中:
参考:hmm这是否也会像绑定参数那样在注入时清理数据?是的,这就是为什么第三个参数($escape)设置为true(默认情况下),它将转义您的输入,它在docs@Manquer你是说第五个参数。
compare
的第三个参数是partialMatch
@topher是的,你是对的,我错误地在docs addSearchCondition中看到了前面的函数,其中escape是第三个@曼克尔发生在我们所有人身上。多亏了托弗,这才是我真正需要的,我唯一担心的是这些女伴被消毒了?
$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
$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