我正在使用Yii addColumnCondition,想把默认行为从'='改为使用LIKE和%

72qzrwbm  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(121)

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

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

bnl4lu3b

bnl4lu3b1#

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的第四个参数,$like = true。您可以将其设置为**$like = false**,并允许该函数在同等条件下工作。(A = B)

也就是

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

如果**$like = true**,它将允许您具有类似条件。(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');
}

相关问题