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 5.3 使用 with() 方法预先加载关系