yii:CDbCriteria-> mergeWith返回null

时间:2014-03-26 16:32:39

标签: php sql yii

我有以下代码:

     if ($query):
        $query_c = new CDbCriteria;
        $query_c->alias = 'P';
        $query_c->compare('name', $query, true, 'AND');
        $query_c->compare('description', $query, true, 'OR');
    endif;

    if ($category):
        $join = new CDbCriteria;
        $join->alias = 'P';
        $join->join='LEFT JOIN product_x_category as P_x_c ON P.id = P_x_c.product_id';

        $join->compare('P_x_c.category_id', '='.Category::model()->find('path=?', array($category))->id);
    endif;

    if ($query && $category):
        $criteria = $query_c->mergeWith($join);
    elseif ($query):
        $criteria = $query_c;
    elseif ($category):
        $criteria = $join;
    endif;

在$ query_c-> mergeWith($ join)之后我期待$条件是类似的东西

 LEFT JOIN product_x_category as P_x_c ON (P_x_c.id = P.id)
 WHERE P_x_c.category_id = x
 AND (P.name LIKE '%query%' OR P.description LIKE '%query%')

但相反,我得到$ criteria == null ...

这里出了什么问题?这不行吗?

2 个答案:

答案 0 :(得分:1)

这可能不是您问题的答案。但请尝试使用以下代码。您只能使用一个条件构建查询。

    $criteria = new CDbCriteria;
    $criteria->alias = 'P';
    if ($query):
        $criteria->compare('name', $query, true, 'AND');
        $criteria->compare('description', $query, true, 'OR');
    endif;

    if ($category):
        $criteria->join = 'LEFT JOIN product_x_category as P_x_c ON P.id = P_x_c.product_id';
        $criteria->compare('P_x_c.category_id', '=' . Category::model()->find('path=?', array($category))->id);
    endif;

答案 1 :(得分:1)

对于遇到这种情况的人来说,问题的根源是mergeWith没有任何回报!

它通过合并传递的条件的属性来更新它的运行条件。这一行:

$criteria = $query_c->mergeWith($join);  

$criteria设置为null,但$query_c现在是$query_c$join的合并。

你需要这样的东西:

$criteria = new CDbCriteria();

if($query){
  $criteria->mergeWith($query_c);
}
if($category){
  $criteria->mergeWith($join);
}