Laravel 5.3查询(按关系分组)

时间:2017-01-29 07:26:23

标签: php laravel collections group-by

现状说明

我试图根据搜索获取所有交易,并且我希望按查询对所有找到的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,而gastransactionsdescription_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`
)

2 个答案:

答案 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()

或者那些东西。这基于https://laravel.com/docs/5.4/queries#selects

答案 1 :(得分:0)

得到了我想要实现的目标:

$new_array = [];

foreach($transactions as $transaction)
{
    $new_array[] = ['name' => $transaction->description->name, 'amount' => $transaction->amount];
}

$collection = collect($new_array)->groupBy('name');