2016-04-14 24 views
0

我试图做的是在嵌套的ng-repeat中获得雄辩关系的最深层次结构的属性。Angularjs + Laravel:在嵌套的ng-repeat中获取雄辩关系的属性

这是关系。

Order ..hasMany.. SubItems ..belongTo.. Product

有一个模型Order,其hasMany模型SubItemsSubItems型号belongsTo型号Product

我有一个Order的数组,我想从Order的每个对象访问相关的Productng-repeat

<table> 
     <tbody ng-repeat="order in tc.orders" >//I use "as" syntax, so I use "tc."here 
      <tr ng-click="tc.showOrderDetail(order.id)"> 
       <td ng-bind="order.id"></td> 
       <!-- "order.id" works in both lines --> 
      </tr> 
       <tr ng-repeat="subItem in order.subItems"> 
        <td ng-bind="subItem.price"></td> 
        <!-- This "subItem.price" appears --> 
        <td ng-bind="subItem.product.name"></td> 
        <!-- This "subItem.product.name" doesn't appear --> 
       </tr> 
     </tbody> 
    </table> 

的关系(SubItems)的第二级可以通过将一个.进行访问,但显然我需要用不同的方式来访问第三级(Product)。

如果您提供任何建议,我将不胜感激。

信息

当我使用Laravel的foreach循环,这可以通过...访问

{{$subItem->product->name}} //This works fine!

控制器的方法是...

public function getOrders() 
{ 
    $orders = $this->order->with('customer', 'subitems')->orderBy('id', 'desc')->get(); 
    return $orders; 
} 
+0

请包含您的控制器代码。 'product'一定不能加载到你的'subItem'模型上,所以我们需要看你的控制器以帮助 – Jeff

+0

谢谢Jeff。我添加了它。相信与否,当我使用Laravel的forloop时,没有错误,而'product'与'subitem'有关。 – Hiroki

+1

当你调用'$ subItem-> product'时,它会自动为你加载它。如果您希望它以JSON格式显示,您必须手动加载它 – Jeff

回答

1

在您的代码中,您不会告诉Laravel急于将项目模型添加到您的子项模式中湖您需要添加产品预先加载像这样:

$this->order->with('customer', 'subitems.product')->orderBy('id', 'desc')->get(); 

和访问它像任何其他JavaScript对象subItem.product.name

它Laravel foreach循环为你工作的原因是因为当你请求像的关系属性Laravel即$subItem->product而不是作为一种方法,Laravel会自动将关系Eloquent对象实例化到Model对象中。

+0

非常感谢。我想再问一个问题......在阅读文档后,我认为在Laravel的模型之间放置一个点('.')并不是常见做法。在控制器中指出Eloquent关系时,这样做是否很常见?或者,你是如何找到它的? – Hiroki

+1

https://laravel.com/docs/master/eloquent-relationships#eager-loading 向下滚动到Nested Eager Loading – Cptmaxon