Laravel:渴望加载特定的列

Posted

技术标签:

【中文标题】Laravel:渴望加载特定的列【英文标题】:Laravel: Eager loading specific columns 【发布时间】:2020-12-05 05:26:14 【问题描述】:

为什么

Order::with(['products'=>function($q)
    $q->select('name', 'price', 'quantity')->orderBy('name','asc');
  ])->paginate($length);

返回所有订单及其各自的产品数据,但是

Order::with(['products'=>function($q)
    $q->select('name', 'price', 'quantity')->orderBy('name','asc');
  ])->select('pickup_date', 'pickup_time', 'remark')->paginate($length);

给我所有我想要的订单数据,但是一个空的产品数组?

我想从 order 表中选择一些特定的列,并从 products 表中选择一些特定的列。我该怎么做?

仅供参考: Orders-products 与模型是多对多的关系: 订购型号:

public function products()

    return $this->belongsToMany('App\Models\Product')->withTimestamps();

产品型号:

public function orders()

  return $this->belongsToMany('App\Models\Order')->withTimestamps();

【问题讨论】:

你的选择方法会是这样的select('products.id as product_id', 'pickup_date', 'pickup_time', 'remark') 【参考方案1】:

你需要这样选择:

Order::with(['products'=>function($q)
    $q->orderBy('name','asc');
  ])->select('products.name as name','products.price as price','products.quantity as quantity','orders.pickup_date as pickup_date', 'orders.pickup_time as pickup_time', 'orders.remark as remark')->paginate($length);

或者没有子查询:

Order::with('products')
   ->select('products.name as name','products.price as price','products.quantity as quantity','orders.pickup_date as pickup_date', 'orders.pickup_time as pickup_time', 'orders.remark as remark')
   ->orderBy('name','asc');
   ->paginate($length);

【讨论】:

【参考方案2】:

您缺少一件事,您应该在外部选择中添加产品ID。

Order::with(['products'=>function($q)
    $q->select('name', 'price', 'quantity')->orderBy('name','asc');
  ])->select('product_id','pickup_date', 'pickup_time', 'remark')->paginate($length);

希望对你有帮助

【讨论】:

这样我得到一个异常:找不到列:1054 未知列'product_id'。数据透视表中的外键是“product_id” 什么意思?这是一个多对多的关系。 Pivot中的外键是order_id和product_id,分别指向orders.id和products.id。

以上是关于Laravel:渴望加载特定的列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4:渴望加载

带有参数的渴望加载 - laravel

Laravel - 渴望加载多态关系的相关模型

Laravel Eloquent:渴望加载多个嵌套关系

Laravel 渴望加载数据透视表关系

采摘渴望加载Laravel 5.2