【问题标题】:Eloquent GroupBy with hasManyThrough relationshipEloquent GroupBy 与 hasManyThrough 关系
【发布时间】:2018-11-18 20:08:17
【问题描述】:

我有三个模型——CompanyDriver 属于公司,Order 属于司机。我已经说明了公司和预订之间的关系,例如:

public function orders() {
    return $this->hasManyThrough(Order::class, Driver::class);
}

但是!如果我想获取按公司分组的所有订单,我该怎么做?

【问题讨论】:

  • 你能告诉我订单表的列吗
  • @hossamGamal 订单:id、due_date、route_from、route_to、price、driver_id

标签: laravel group-by eloquent has-many-through


【解决方案1】:

你可以在你的order模型中制作Accessor来得到company_id

public function getCompanyIdAttriubte(){
    return $this->driver->company->id;
}

然后通过company_id获取订单组

$orders = Order::all();
$orders = $orders->groupBy('company_id');

您可以查看这些链接以了解 id 究竟做了什么 https://laravel.com/docs/5.7/collections#method-groupby https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor

【讨论】:

  • 使用 get() 而不是 all() 更好地使用预加载。
【解决方案2】:

你有两种方法:

第一:

$companies = Company::with(['orders', 'orders.user'])
    ->whereHas('orders')
    ->get();

foreach($companies as $company){
    echo $company->id;
    foreach($company->orders as $order){
        echo $order->driver->id;
        echo $order->id;
    }
}

第二:

$orders = Orders::with(['driver', 'driver.company'])->get();

$orders = $orders->groupBy(function($order){
    return $order->driver->company_id;
});

foreach($orders as $companyId => $group){
    foreach($group as $order){
        echo $order->id;
        echo $oder->driver->id;
        echo $order->driver->company->id;
    }
}

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2020-10-14
    • 2020-02-02
    • 2016-09-26
    • 2019-03-26
    • 2015-07-27
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多