【问题标题】:Laravel Eloquent Get grouped by Relation DataLaravel Eloquent 按关系数据分组
【发布时间】:2019-07-30 15:15:59
【问题描述】:

我正在尝试通过按关系分组的急切加载来获取数据。意味着,我想急切地加载列中的关系。这个代码我试过了,

$customer = Customer::with(['orders' => function($query) {
        $query->groupBy('shop_id');
    }])->where('id', $id)->get();

这里是数据库关系,

客户有很多订单(一对多)

例如,如果我想分组shop_id,我希望数据格式如下:

customer1 => 
    otherProperties,
    orders =>[
        shop_id1 => [
            order1,
            order2 ...
        ],
        shop_id2 => [
            order5
        ]
    ]

但我得到的是正常的急切加载数据,例如,

customer1 => 
    otherProperties,
    orders => [
       order1,
       order2,
       order5,
    ]

有人可以在这方面帮助我吗? 我可以使用原始查询或 php 获得类似的结果。但是我如何使用 eloquent 来实现这一点呢?

【问题讨论】:

  • 您的 created_at 是通过迁移创建的默认时间戳吗?如果是这样,它看起来像这样2016-09-21 18:50:26。因此,如果您的客户的订单在同一秒保存到数据库中,您将永远不会在同一个袋子里有 2 个订单。你可以看看这个:stackoverflow.com/questions/41483365/…
  • 这里,我使用created_at只是为了演示。实际上我使用的是不同的列。我正在更新我的问题。我只是使用created_at 来更好地理解。

标签: laravel group-by eloquent model relation


【解决方案1】:

groupBy 发生在集合上,而不是查询本身。

第一个建议:创建自定义范围

您可以使用一些原始表达式在模型中创建自定义范围:https://laravel.com/docs/5.8/queries#raw-expressions。然后,您将能够这样做:

$customer = Customer::with('newScope')->find($id);

你知道吗$customer = Customer::where('id', $id)->get() 返回模型集合和$customer = Customer::find($id) 返回单个模型?

$customer = Customer::where('id', $id)->get();
$customer = { [0] => {data} };

$customer = Customer::find($id);
$customer = { data };

第二个建议:查询后在集合上使用 groupBy

$customer = Customer::with('orders')->find($id);
$customer->orders = $customer->orders->groupBy('shop_id'));

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2021-07-14
    • 2021-01-25
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多