我正在尝试在Yii中添加以下条件:
$a = [1,2,3];
$b = [1,2,3];
$criteria->addCondition('A IS NULL', 'AND');
$criteria->addInCondition('A', $a, 'OR');
$criteria->addCondition('B IS NULL', 'AND');
$criteria->addInCondition('B', $b, 'OR');
我希望下面的MySQL会出现:
WHERE (A IS NULL OR A IN (1,2,3))
AND (B IS NULL OR B IN (1,2,3))
但是唉了一声:
WHERE (((A IS NULL) OR A IN (1,2,3)) AND B IS NULL) OR B IN (1,2,3)
基本上,对于任何不了解yii的人,我想将(a+b)(c+d)
重写为((w ? x) ? y) ? z
,这是否可以不重复任何条件?或者我是否需要考虑替代方案?
答案 0 :(得分:1)
我无法理解您在重写(a+b)(c+d)
到((w ? x) ? y) ? z
时所提出的问题,但如果您想创建以下条件:
WHERE (A IS NULL OR A IN (1,2,3))
AND (B IS NULL OR B IN (1,2,3))
然后只使用此代码:
$a = [1,2,3];
$b = [1,2,3];
$criteria1 = new CDbCriteria;
$criteria1->addCondition('A IS NULL');
$criteria1->addInCondition('A', $a,'OR');
$criteria2 = new CDbCriteria;
$criteria2->addCondition('B IS NULL');
$criteria2->addInCondition('B', $b,'OR');
$criteria = new CDbCriteria();
$criteria->addCondition($criteria1->condition);
$criteria->addCondition($criteria2->condition);
$criteria->params = array_merge($criteria1->params,$criteria2->params);
结果条件通过
给出echo $criteria->condition;
作为
((A IS NULL) OR (A IN (:ycp0, :ycp1, :ycp2)))
AND ((B IS NULL) OR (B IN (:ycp3, :ycp4, :ycp5)))
(ycp#
是$a
和$b
中指定的参数化值。)