这与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,但返回全部三个。
答案 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 ] );