我基本上有一个活动查询,我想要过滤该列,如果它与ID匹配或为空
MyTable::find()->andFilterWhere(['in', 'org_id', [null, $org_id]])->all();
目前使用此功能,适用于$org_id
,但不会返回null
值。
我试过这个看看我是否可以获得任何空结果,但没有效果
MyTable::find()->andFilterWhere(['in', 'org_id', null])->all();
任何提示?
答案 0 :(得分:5)
纠正你的查询:
MyTable::find()
->andFilterWhere(['in', 'org_id', $this->org_id])
->orWhere(['org_id' => null])
->all();
您也可以使用数组指定IS NULL
条件,orWhere
就足够了,因为此条件不依赖于属性值。
答案 1 :(得分:1)
如果您使用的是多个值的过滤器,则以下查询将导致数组中包含null或值的单元格:
$query->andWhere(['or', ['in', 'column', $value_array], ['column' => null]]);
答案 2 :(得分:0)
为了强化arogachev的答案,如果您只想查询null结果,这是一个很好的参考: https://github.com/yiisoft/yii2/issues/6788
$query->andfilterWhere('org_id' => null)
此查询不起作用,因为filterWhere会删除空参数。
对于null结果,请使用:
$query->andWhere('org_id' => null)
答案 3 :(得分:0)
要完全回答这个问题,请重申我们真正想要的内容。
我们需要从某些表格中获取所有具有特定'field'
的记录,使其与给定的$value
或null
相等。
根据该定义,我们可以将其直接翻译为Query
调用:
$query->andWhere(['or', ['field' => $value], ['field' => null]]);
在$value
为null
的情况下,这有点不理想,因为它提供了SQL WHERE (field IS NULL) OR (field IS NULL)
。
您可以通过使用andWhere
声明包裹if
来缓解此问题:
if ($value === null)
$query->andWhere(['field' => null]);
else
$query->andWhere(['or', ['field' => $value], ['field' => null]]);
或根据您的喜好,使用三元运算符:
$query->andWhere(
$value === null
? ['field' => null]
: ['or', ['field' => $value], ['field' => null]]
);
在任何情况下,使用andFilterWhere
都会完全违背查询的目的,因为它仅用于从查询中删除['field' => null]
之类的内容。