我正在尝试使用Laravels eagerlaoding功能,但它根本不像预期的那样。
我已经尝试过遵循官方的例子,但我无法重现他们的行为。
我有一个Product
类hasMany('OrderLine')
表示此产品的实际订单。
我希望在显示产品及其订单数量时加急线路,所以我这样做:
$products = Product::with('OrderLines')->get();
foreach($products as $product) {
var_dump($product->orderlines->first());
};
这应该可以正常工作,对吧?
好吧,当我检查SQL日志时,会发生这种情况:
[SQL] select * from "products"
bindings: []
time: 0.71 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" in (?, ?, ?, ?)
bindings: [2,3,4,5]
time: 0.79 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [2]
time: 0.32 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [3]
time: 0.3 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [4]
time: 0.31 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [5]
time: 0.29 milliseconds
我似乎无法理解Laravel / Eloquent为何如此行事。首先它正确地加载了行,但是当我循环遍历产品时它忽略了预加载的订单行......?
答案 0 :(得分:1)
你应该以这种方式循环orderlines
:
foreach($products as $product) {
foreach ($product->orderlines as $ol) {
echo $ol->name;
}
}
修改强>
我已经检查了,问题就是信件。
如果您的关系名称为orderLines
,则应使用:
$products = Product::with('orderLines')->get();
foreach($products as $product) {
foreach ($product->orderLines $ol) {
echo $ol->name;
}
}
因此,在所有地方,您应该使用orderLines
完全相同的内容 - 不在一个地方OrderLines
和另一个orderlines