我试图根据搜索获取所有交易,并且我希望按查询对所有找到的description
结果进行分组,以便我可以在结果下方显示这些结果。
例如,我在两个日期之间进行搜索。这工作正常,但我可能无法对这些结果使用group_by
,因为date
字段仅出现在transactions
表中,所以我不能做一个简单的{{1查询。
我其实不知道该怎么做。现在我使用以下查询:
descriptions
$first = auth()->user()->transactions()
->with('description')
->where('type', 'expense')
->where('date', '>=', $this->parseDate()->firstOfMonth()->format('Y-m-d'))
->where('date', '<=', $this->parseDate()->lastOfMonth()->format('Y-m-d'))
->get();
}
实际上只是以特定格式创建搜索的Carbon实例。
此查询显示实际结果。这一切都很好。
我们假设有一个$this->parseDate()
被称为description
,而gas
有transactions
个description_id
。这意味着,将返回5个结果。但是,在这些结果旁边,我想返回所有找到的描述的gas
版本,计算grouped_by
的总数和每个descriptions
的总amount
。这看起来像这样:
description
我不能简单地在原始查询上添加Gas Results: 5 Total amount: $ 542
,如下所示:
groupBy('description_id)
因为那只会返回一个包含一个项目的集合,该项目再次包含原始集合。
任何指针?
$second = $first->groupBy('description_id');
CREATE TABLE `transactions` (
`id`,
`user_id`,
`description_id`,
`name`,
`type`,
`date`,
`amount`,
`created_at`,
`updated_at`
)
CREATE TABLE `descriptions` (
`id`,
`user_id`,
`name`,
`created_at`,
`updated_at`
)
答案 0 :(得分:1)
如果您获得单个Transaction
的相关模型q,那么group by没有意义。您已检索到具有正确的组。
另一方面,您可以执行以下操作:->count()
或->max("columname")
来获取各个聚合。请查看https://laravel.com/docs/5.4/eloquent#retrieving-aggregates以获取更多相关信息。
由于eloquent查询构建器本质上是一个流畅的查询构建器,您可能也可以这样做:
$first = auth()->user()->transactions()
->with('description')
->where('type', 'expense')
->where('date', '>=', $this->parseDate()->firstOfMonth()->format('Y-m-d'))
->where('date', '<=', $this->parseDate()->lastOfMonth()->format('Y-m-d'))
->select("transaction.*", \DB::raw("count() count"), \DB::raw("sum(description.amount)"))
->get()
答案 1 :(得分:0)
得到了我想要实现的目标:
$new_array = [];
foreach($transactions as $transaction)
{
$new_array[] = ['name' => $transaction->description->name, 'amount' => $transaction->amount];
}
$collection = collect($new_array)->groupBy('name');