ActiveQuery count()和all()返回不同的结果

时间:2017-08-08 11:53:01

标签: php yii2

我有一个问题:

$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;

我无法解决这个问题。阅读文档没有帮助。数据库本身有问题吗?

2 个答案:

答案 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,这样你就有了独特的行。