我有一个问题:
$query = Products::find();
$query->joinWith('vendor', true, 'LEFT JOIN');
$query->joinWith('values', true,'LEFT JOIN');
$query->where(['<>', 'stock', 7]);
$query->andWhere(['category_id' => $model->id]);
if (!empty($activeVendors))
$query->andWhere(['lan_vendors.id' => array_flip($activeVendors)]);
if (!empty($activeValues)){
$query->andWhere(['lan_products_values.value_id' => $activeValues]);
}
$totalProducts = $query->count();
$products = $query->all();
结果:
$totalProducts = 12;
count($products) = 3;
我无法解决这个问题。阅读文档没有帮助。数据库本身有问题吗?
答案 0 :(得分:1)
您的左连接语句会生成重复的行
在查询运行yii removes duplicate data之后创建一个可用的uniqe Product
模型数组
由于您使用左连接强制执行预先加载
,因此在您的情况下无法避免重复行$query->joinWith('vendor', true, 'LEFT JOIN');
$query->joinWith('values', true,'LEFT JOIN');
您可以尝试运行类似这样的内容来根据条件调整关系,并按照生成的查询进行操作 在调试日志中,
$query->with([
'vendor' => function (\yii\db\ActiveQuery $query) use ($activeVendors) {
$query->andFilterWhere(['lan_vendors.id' => array_flip($activeVendors)]);
},
'values' => function (\yii\db\ActiveQuery $query) use ($activeValues) {
$query->andWhere(['lan_products_values.value_id' => $activeValues]);
},
])
也遵循调试日志中生成的查询,这是一种了解两种情况下发生情况的有用方法
答案 1 :(得分:0)
因为你在这里加入其他表很可能你得到了重复的结果 - 你可以通过在Yii之外手动运行这个查询来检查它。
查询count()
显示从数据库中提取的所有行(带有重复项)。
all()
获取所获取的行,同时填充Yii 2模型removes duplicates,这样你就有了独特的行。