【问题标题】:Laravel eloquent sum and count within a query for nested relationshipsLaravel eloquent sum and count 在嵌套关系的查询中
【发布时间】:2020-03-19 09:25:36
【问题描述】:

背景

我有 4 个相互嵌套关系的表。

events 
contests (foreign key: evt_id)  
entries (foreign key: con_id) 
entry_winner (foreign key: ent_id)

我能够从 Entry 模型中获得具有此类关系的记录。

$accepted = Entry::where("is_canceled", "=", "0")
            ->with(["contest.event", "entryWinner"])
            ->whereHas("contest.event", function($query) {
                $query->where('datetime_utc', ">",Carbon::today());
            })
            ->has("entryWinner")
            ->get();

到目前为止一切顺利。

问题

我想从查询中得到的是查询中的两件事。

  1. 记录总数(计数)
  2. 关系表列的总和。 (总和)

这是一个完全适合我的查询。

SELECT 
    COUNT(*) AS accepted,
    SUM(contests.ent_fee) AS funds
FROM entries
LEFT JOIN contests ON contests.id = entries.con_id
RIGHT JOIN `events` ON `events`.id = contests.evt_id AND `events`.datetime_utc > '2019-11-22 00:00:00'
RIGHT JOIN entry_winners ON entry_winners.ent_id = entries.id
WHERE is_canceled = 0;

我只是好奇如何使用 Eloquent 实现这一目标

如何同时使用 SUM 和 COUNT ??

【问题讨论】:

  • 我认为您不能在 with() 中获取 sumcount,然后将其发布到 Eloquent 的父母专栏。所以只需使用Model::leftjoin() 即可。

标签: laravel eloquent eloquent-relationship


【解决方案1】:

试试下面:

$query = Entry::where("is_canceled", "=", "0")
            ->with(["entryWinner", "contest" => function($query) {
                $query->whereHas("event", function($qry) {
                    $qry->where('datetime_utc', ">",Carbon::today());
                })->sum('ent_fee');
            }])
            ->has("entryWinner");
$count = $query->count();
$results = array_column($query->get()->toArray(), 'contest');
$sum = array_sum(array_column($results, 'ent_fee'));

它应该可以工作并帮助你。

【讨论】:

  • 我收到此错误:“字段列表”中的未知列“contest.ent_fee”
  • 试试contests.ent_fee
  • 我遇到了同样的错误,经过一些研究后我注意到我无法将相关的数据库列与 DB::raw 一起使用。
  • 我已经更新了解决专栏相关问题的答案。这是您可以继续进行的逻辑。
  • 如果更新后的解决方案仍然存在问题,那么我建议您使用DB::raw("Your SQL query goes here")。不过,这并不总是最佳做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2014-09-27
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多