php - MySQL 与字符串数组类似

标签 php yii

我有一个单词数组。

$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%'))

为了避免这种情况,您有几个选择:

  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
    

使用(2)。


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

关于php - MySQL 与字符串数组类似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100691/

相关文章:

php - MySQL 返回行如果存在,否则不同的行

javascript - 我想更新当前页面 codeigniter 中的 ID

php - 如何避免在 codeigniter Controller 函数上调用多个模型?

php - 从 cgridview 中的按钮访问 $data 变量

php - YII php 框架本地主机工作但 127.0.0.1 不

ajax - 来自 Yii CListView 的 "Post"参数

php - 如何在 cgridview yii 中的 <td> 之后放置一个 <div> 标签?

javascript - 如何在输入更改时发布到 php,然后在内容 div 中获取结果

php - 在 FPDF PHP 中使用 SetXY() 单元格在新页面中开始

php - Yii2 View 中的组件函数