Pra*_*tar 1 php search criteria yii sql-like
addColumnCondition
我使用函数,因为我喜欢它如何形成多个查询的查询.但我在文档中找不到任何改变它的比较操作,从简单= needle
到a LIKE %needle%
.有一个函数可以执行LIKE
,addSearchCondition()
但是它意味着获得相同的查询形成结果,我将不得不做一些循环和合并条件,如果有更好的解决方案,我想避免.
这是代码
foreach($query_set as $query){
foreach($attributes as $attribute=>$v){
$attributes[$attribute] = $query;
}
$criteria->addColumnCondition($attributes, 'OR', 'AND');
}
Run Code Online (Sandbox Code Playgroud)
而我正在形成像这样的条件
(business_name=:ycp0 OR payment_method=:ycp1) AND (business_name=:ycp2 OR payment_method=:ycp3)
Run Code Online (Sandbox Code Playgroud)
那么有没有办法配置使用的功能LIKE %:ycp0%
而不是简单的=:ycp0
.
任何帮助将不胜感激.
谢谢.
看来,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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意: addColumnCondition的第4个参数,$ like = true.您可以将其设置为$ like = false并允许该函数在相同条件下工作.(A = B)
即
(business_name=:ycp0 OR payment_method=:ycp1) AND (business_name=:ycp2 OR payment_method=:ycp3)
Run Code Online (Sandbox Code Playgroud)
如果$ like = true,它将允许你有类似条件.(比如%B%)
即
(business_name LIKE %:ycp0% OR payment_method LIKE %:ycp1%) AND (business_name LIKE %:ycp2% OR payment_method LIKE %:ycp3%)
Run Code Online (Sandbox Code Playgroud)
现在这是工作代码,
$criteria = new AppCriteria();
foreach($query_set as $query){
foreach($attributes as $attribute=>$v){
$attributes[$attribute] = $query;
}
$criteria->addColumnCondition($attributes, 'OR', 'AND');
}
Run Code Online (Sandbox Code Playgroud)