按 id 分组 Laravel Eloquent 枢轴值

Posted

技术标签:

【中文标题】按 id 分组 Laravel Eloquent 枢轴值【英文标题】:Group Laravel Eloquent pivot values by id 【发布时间】:2021-12-28 10:37:48 【问题描述】:

我有一个关系数据库,其模型如下所示: 餐厅:

class Restaurant extends Authenticatable

    public function dishes()
    
        // return $this->hasMany(Dish::class);
        return $this->belongsToMany('App\Models\Dish');
    

菜:

class Dish extends Model

    public function orders()
    
        return $this->belongsToMany('App\Models\Order')->withPivot('quantity');
    

    public function restaurant()
    
        return $this->belongsToMany('App\Models\Restaurant');
    

订购

class Order extends Model

    public function dishes()
    
        return $this->belongsToMany('App\Models\Dish');
    

我正在按 id 检索属于餐厅的所有订单,如下所示:

public function index($id)
    
        $user_id = $id;
        $dishes = Dish::where('restaurant_id', $user_id)->get();

        foreach ($dishes as $dish => $value) 
            $orders = $value->orders;
            foreach ($orders as $order => $value) 
                $response[] = $value;
            
        
        return response()->json($response);
    

这可行,但我想以某种方式按 order_id 对这些结果进行分组,以便返回类似于以下内容的内容:

 
        "id": 28,
        "status": 1,
        "address": "Fish Street",
        "user_name": "Artyom",
        "user_surname": "Pyotrovich",
        "phone": "351 351 643 52",
        "email": "artyom@restaurant.com",
        "total": 35.8,
        "created_at": "2021-11-17T10:44:58.000000Z",
        "updated_at": "2021-11-17T10:44:58.000000Z",
        "dishes": [
            "dish_id": 22,
            "quantity": 3
                   , 
                   
            "dish_id": 23,
            "quantity": 1
                  ]
    

这是否可以通过简单地更改 Eloquent 查询来实现,或者我是否需要对当前查询的结果执行多个操作?还对这些情况下的最佳实践感兴趣。 提前致谢

【问题讨论】:

一个订单属于很多菜还是一个订单有很多菜?第二种方法可以产生理想的结果,因为菜肴是按顺序排列的。 Orders 和 Dishes 是多对多关系(两个模型都使用 belongsToMany) 【参考方案1】:

您可以使用::with() 方法来获取所有所需的关系,这比foreach 重写要干净得多。

示例:

$orders = Order::with('dishes')
    ->whereHas('dishes', function(Builder $dishes) use ($user_id) 
        $dishes->where('restaurant_id', $user_id);
    )->get();

return response()->json( $order );

小记:

把用户id和餐厅id分开,如果用户有多家餐馆怎么办?

【讨论】:

以上是关于按 id 分组 Laravel Eloquent 枢轴值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent,按月/年分组

Laravel Eloquent 查询,带有连接、计数和分组依据

Laravel Eloquent按天分组结果

Laravel Eloquent 如何在 Postgresql 中使用 DATE_FORMAT

Eloquent 获取按日期分组的最后一条记录

Laravel Eloquent Model 相关查询未按预期工作