我有以下代码:
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 ...
这里出了什么问题?这不行吗?
答案 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);
}