Laravel with([]) 仅选择关系的某些列[重复]

问题描述 投票:0回答:4

编辑

这个问题很独特,因为它提出了独特的问题,例如:

  1. 组件内的关系。 (商品.产品.库存管理)。
  2. 大量组件,这导致链接问题的接受答案不适用。

假设你有一个像下面这样的大 with() :

$order = Order::with([
        'company',
        'complaints',
        'person',
        'items',
        'items.product',
        'items.product.stockManagement',
        'status', 
    ])->findOrFail($id);

然后我怎样才能选择它们的所有关系,但只选择其中一些的特定列?

$order = Order::with([
        'company',   // select only id,name, size
        'complaints',  // select only id, name , body
        'person',     
        'items',  
        'items.product',  // select only id, name , price
        'items.product.stockManagement',
        'status',  // select only id
        'items.product.media',
        'items.product.mainProduct',
        'items.product.mainProduct.media'
    ])->findOrFail($id);
php laravel eloquent
4个回答
7
投票

像这样:

$order = Order::with([
    'company:id,name,size',
    'complaints:id,name,body',
    'person',     
    'items',  
    'items.product:id,name,price',
    'items.product.stockManagement',
    'status:id',
    'items.product.media',
    'items.product.mainProduct',
    'items.product.mainProduct.media'
])->findOrFail($id);

文档关于特定列的加载非常简短(您甚至需要向下滚动一点到“急切加载特定列”的标题)。

您可能并不总是需要您正在检索的关系中的每一列。因此,Eloquent 允许您指定要检索关系的哪些列:

$books = App\Book::with('author:id,name')->get();

注:

使用此功能时,您应始终在要检索的列列表中包含 id 列和任何相关的外键列


3
投票

您还可以为一些更高级的关系查询提供回调。

Order::with([
    'company' => function ($q) {
         $q->select('id', 'name');
    }
])

2
投票

我也遇到了同样的问题。您需要指定

foreign id
而不是id(主键)

例如:

Data::with('other:id,name')->get();

如果自定义了外文名称,将无法正常工作。 因此,您需要完整添加您的外来列名称

Data::with('other:foreign_id,name')->get();

那会起作用的!


0
投票
$order = Order::with(
['company' => function($query) {
    $query->select('id','name','size')
 }),
'complaints' => function($query) {
    $query->select('id','name','body')
 }),
'person',    
'items',  
'items.product'  => function($query) {
    $query->select('id','name','price')
 }), 'items.product.stockManagement','status'=> function($query) {
    $query->select('id')
 }),'items.product.media', 'items.product.mainProduct', 'items.product.mainProduct.media'])->findOrFail($id);
© www.soinside.com 2019 - 2024. All rights reserved.