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

Posted

技术标签:

【中文标题】Laravel with([]) 仅选择关系的某些列【英文标题】:Laravel with([]) select only some columns of the relation 【发布时间】:2020-10-15 17:16:39 【问题描述】:

编辑

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

    与组件之间的关系。 (items.product.stockManagement)。 大量组件,这会导致链接问题的已接受答案不适用。

假设你有一个大的 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);

【问题讨论】:

这能回答你的问题吗? Get Specific Columns Using “With()” Function in Laravel Eloquent 可能这是重复的,但另一个问题有很多无用的答案,但也许该帖子也可能有所帮助。 【参考方案1】:

我遇到了同样的问题。您需要指定 foreign id 而不是 id(主键)

例如:

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

如果您自定义外国名称,它将无法正常工作。 因此,您需要完全添加您的外国列名

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

这会奏效的!

【讨论】:

【参考方案2】:
$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);

【讨论】:

【参考方案3】:

像这样:

$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);

documentation 非常简短地介绍了特定列的加载(您甚至必须向下滚动一点到“急切加载特定列”的标题)。

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

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

注意:

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

【讨论】:

请描述你的答案。 @unclexo 更好吗? 是的。非常感谢!【参考方案4】:

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

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

【讨论】:

以上是关于Laravel with([]) 仅选择关系的某些列的主要内容,如果未能解决你的问题,请参考以下文章

c9 上的 Laravel Blade 模板仅选择性地扩展到某些页面

Laravel Eloquent,仅选择存在关系的行

Laravel 急切加载具有限制和自定义字段的子关系

Laravel 5.3 使用 with() 方法预先加载关系

仅从 Laravel 5.2 关系查询中选择特定列不起作用 [重复]

通过findMany选择列并在Laravel的Eloquent中保持关系