【问题标题】:Eloquent's sum() Results to Zero after skip()Eloquent 的 sum() 在 skip() 后结果为零
【发布时间】:2015-12-11 15:38:27
【问题描述】:

我遇到了关于独立 Eloquent 的问题。我有一个这样的查询:

$data = TestModel::where('total', '>', 0 )->take(10)->skip(0)->get();

当我这样做时:

$val = $data->sum('total');

它将正确返回总和而没有任何问题。但是一旦我将 skip() 函数设为:->skip(10) 或任何大于零的数字,它将返回值为 0 的 $data->sum()

查询的SQL如下:

跳过 = 0

select * from `test` where `total` > ? order by `date` desc

skip > 0(包括 10 次)

select * from `test` where `total` > ? order by `date` desc limit 10 offset 1

任何想法可能是什么问题?

谢谢

【问题讨论】:

    标签: php sql laravel laravel-5 eloquent


    【解决方案1】:

    您粘贴的 SQL 查询不是您调用 sum() 时运行的查询。当调用此方法时,Eloquent 不会获取结果并计算结果集合中 total 列的总和 - 而是修改您构建的查询并调用以下 SQL 查询:

    select SUM(total) from `test` where `total` > ? order by `date` desc
    select SUM(total) from `test` where `total` > ? order by `date` desc limit 10 offset 1
    

    这些查询会产生单行响应。因此,当您在查询上应用 skip() 方法时,您会跳过第一行,因此您会得到 0 作为结果。

    【讨论】:

    • 我明白了。是否可以对 sum() 方法应用 skip() 和 take()?
    • 我假设您只想计算某些行的总和?您需要使用 WHERE 条件过滤它们,例如使用 skip/take 获取 ID 列表,然后使用 whereIn('id', $list_of_ids) 进行 sum()
    • 是的。只有几行。但我想将结果限制为只有 10 行偏移的 10 项。这是用于分页总和
    • 正如我所说的,你不能用一个查询来做 - 你需要 2 个查询(你可以用 Eloquent 做)或一个带有子选择的查询,但在这里你需要使用 raw SQL,类似于 SELECT SUM(total) FROM test WHERE id IN (SELECT id FROM total LIMIT 10 OFFSET 1) -
    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多