Laravel 5.8 如何获取三个互相关联模型的对应数据
实现方法
你需要用到Laravel的嵌套预加载功能,操作非常简单:
- 首先确认
ProductOrder模型中已经定义了指向Product模型的关联方法,示例如下:
// App/Models/ProductOrder.php public function product() { return $this->belongsTo(Product::class); // 如果外键名不是默认的product_id,需要手动指定第二个参数,比如: // return $this->belongsTo(Product::class, 'prod_id'); }
- 把原查询的预加载参数改成点语法拼接的嵌套关联即可,代码如下:
Order::with('product_orders.product')->get();
返回的结果集中,你可以直接通过$order->product_orders->first()->product获取对应Product数据,全程不会产生N+1性能问题。
如果需要给关联层加自定义查询条件,可以用数组格式的预加载写法:
Order::with([ 'product_orders' => function ($query) { // 可自定义ProductOrder的查询逻辑,比如过滤退款的条目 $query->where('refund_status', '!=', 'success'); }, 'product_orders.product' => function ($query) { // 可自定义Product的查询逻辑,比如只返回必要字段 $query->select('id', 'name', 'price'); } ])->get();
内容的提问来源于stack exchange,提问作者adeab
相关产品推荐
相关产品推荐

