Laravel渴望加载不工作

时间:2014-10-16 20:34:59

标签: php laravel orm eloquent eager-loading

我正在尝试使用Laravels eagerlaoding功能,但它根本不像预期的那样。

我已经尝试过遵循官方的例子,但我无法重现他们的行为。

我有一个ProducthasMany('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为何如此行事。首先它正确地加载了行,但是当我循环遍历产品时它忽略了预加载的订单行......?

1 个答案:

答案 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