yii2 andFilterWhere只返回所有参数匹配的查询

时间:2017-08-09 14:36:15

标签: yii2

这与SQL Select only rows where exact multiple relationships exist密切相关,但我正在寻找Yii2解决方案。

╔════════════╦════════╗
║ PARENT_ID  ║ NAME   ║
╠════════════╬════════╣
║         1  ║ bob    ║
║         2  ║ carol  ║
║         3  ║ stew   ║
╚════════════╩════════╝

╔════════════╦══════════╗
║ PARENT_ID  ║ PROP_ID  ║
╠════════════╬══════════╣
║         1  ║       5  ║
║         1  ║       1  ║
║         2  ║       5  ║
║         2  ║       4  ║
║         2  ║       1  ║
║         3  ║       1  ║
║         3  ║       3  ║
╚════════════╩══════════╝

我只需要选择具有指定所有关系的父母。

如果任何关系匹配,则使用andFilterWhere会返回查询:

$this->prop_arr = Array(1,5);
$query->andFilterWhere( ['in', 'prop.prop_id', $this->prop_arr ] );

这会返回prop_id = 1或prop_id = 5的行,只有在prop_id = 1 AND prop_id = 5

的情况下才需要返回行

所以它应该只返回parent_id 1& 2,但返回全部三个。

2 个答案:

答案 0 :(得分:1)

不是andFilterWhere解决方案,但也许会有所帮助。

$props = [5, 1];
$having = ['and', new \yii\db\Expression('SUM(PROP_ID NOT IN (' . implode(',', $props) . ')) = 0')];
foreach ($props as $prop) {
    $having[] = ['and', new \yii\db\Expression("SUM(PROP_ID = $prop) = 1")];
}
ParentProp::find()
    ->select('PARENT_ID')
    ->groupBy('PARENT_ID')
    ->having($having)
    ->asArray()
    ->all();

您需要确保$props数组仅包含受信任的值。

答案 1 :(得分:0)

您需要使用andWhere而不是andFilterWhere:

  $this->prop_arr = Array(1,5);
  $query->andWhere( ['in', 'prop.prop_id', $this->prop_arr ] );