MySQL与字符串数组一样

时间:2014-08-03 00:57:02

标签: php yii

我有一系列文字。

$terms = array('bars', 'bar', 'fun');

我正在尝试查找包含每个单词的所有记录。

TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms)));

不确定在阵列中找到所有内容的正确方法。

2 个答案:

答案 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%'))

为避免这种情况,您有以下几种选择:

  1. 始终确保首先显示“数组条件”。
  2. 专门为您的数组值创建另一个条件对象,并使用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
    
  3. 专门为您的数组值创建另一个条件对象,并使用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
    
  4. 使用(2)。


    参考:http://www.yiiframework.com/wiki/610/how-to-create-a-criteria-condition-for-a-multiple-value-text-search-i-e-a-like-in/