我使用addColumnCondition
函数,因为我喜欢它为多个查询形成查询的方式。但我在文档中找不到任何东西可以将它的比较操作从简单的= needle
更改为LIKE %needle%
。有一个函数在addSearchCondition()
中执行LIKE
,但这意味着要获得相同的查询形式结果,我必须对循环和合并条件执行一些操作,如果有更好的解决方案,我希望避免这些操作。
这是代码
foreach($query_set as $query){
foreach($attributes as $attribute=>$v){
$attributes[$attribute] = $query;
}
$criteria->addColumnCondition($attributes, 'OR', 'AND');
}
我正在形成类似的条件
(business_name=:ycp0 OR payment_method=:ycp1) AND (business_name=:ycp2 OR payment_method=:ycp3)
因此,有没有一种方法可以将函数配置为使用LIKE %:ycp0%
而不是简单的=:ycp0
。
Yii的addColumnCondition方法似乎没有提供此功能。
因此,我推荐一种重写CDbWriter类的方法并以自己的方式自定义它的方法。
您需要创建一个名为"AppCriteria"的新类,然后将其放置在受保护的/models中
新类的代码应该看起来像
即
class AppCriteria extends CDbCriteria {
public function addColumnCondition($columns, $columnOperator = 'AND', $operator = 'AND', $like = true) {
$params = array();
foreach ($columns as $name=>$value) {
if ($value === null)
$params[] = $name.' IS NULL';
else {
if ($like)
$params[] = $name.' LIKE %'.self::PARAM_PREFIX.self::$paramCount.'%';
else
$params[] = $name.'='.self::PARAM_PREFIX.self::$paramCount;
$this->params[self::PARAM_PREFIX.self::$paramCount++] = $value;
}
}
return $this->addCondition(implode(" $columnOperator ", $params), $operator);
}
}
注意:addColumnCondition的第四个参数,$like=true。您可以将其设置为$like=false,并允许该函数在同等条件下工作。(A=B)
即
(business_name=:ycp0 OR payment_method=:ycp1) AND (business_name=:ycp2 OR payment_method=:ycp3)
如果$like=true,它将允许您具有like条件。(A类%B%)
即
(business_name LIKE %:ycp0% OR payment_method LIKE %:ycp1%) AND (business_name LIKE %:ycp2% OR payment_method LIKE %:ycp3%)
这是工作代码,
$criteria = new AppCriteria();
foreach($query_set as $query){
foreach($attributes as $attribute=>$v){
$attributes[$attribute] = $query;
}
$criteria->addColumnCondition($attributes, 'OR', 'AND');
}