如何在Yii2中找到属性等于value或为null的ActiveRecords

时间:2015-03-03 17:39:15

标签: php sql activerecord yii2

我基本上有一个活动查询,我想要过滤该列,如果它与ID匹配或为空

MyTable::find()->andFilterWhere(['in', 'org_id', [null, $org_id]])->all();

目前使用此功能,适用于$org_id,但不会返回null值。 我试过这个看看我是否可以获得任何空结果,但没有效果

MyTable::find()->andFilterWhere(['in', 'org_id', null])->all();

任何提示?

4 个答案:

答案 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'的记录,使其与给定的$valuenull相等。

根据该定义,我们可以将其直接翻译为Query调用:

$query->andWhere(['or', ['field' => $value], ['field' => null]]);

$valuenull的情况下,这有点不理想,因为它提供了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]之类的内容。