我正在使用Yii addColumnCondition并希望将默认行为从'='更改为使用LIKE和%

问题描述 投票:1回答:1

我正在使用addColumnCondition函数,因为我喜欢它如何形成多个查询的查询。但我在文档中找不到任何改变它的比较操作,从简单的= needleLIKE %needle%。有一个函数在LIKE中执行addSearchCondition()但是它意味着获得相同的查询形成结果,我将不得不做一些循环和合并条件,如果有更好的解决方案我想避免。

这是代码

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

php search yii sql-like criteria
1个回答
5
投票

看来,Yii的addColumnCondition方法不提供此功能。

因此,我建议一种覆盖CDbCriteria类方法的方法,并以自己的方式自定义它。

您需要创建一个名为“AppCriteria”的新类,然后将其放在protected / 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的第4个参数,$ like = true。您可以将其设置为$ like = false并允许该函数在相同条件下工作。 (A = B)

(business_name=:ycp0 OR payment_method=:ycp1) AND (business_name=:ycp2 OR payment_method=:ycp3)

如果$ like = true,它将允许你有类似条件。 (比如%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');
}
© www.soinside.com 2019 - 2024. All rights reserved.