我一直试图找出这个问题好十个小时,我不知道我哪里出错了。我希望订单中的商品根据他们与订单的关系来显示。
我有3个表,我需要在加载用户个人资料页面时提供信息。在该页面上,我试图显示先前的订单(即:订单日期)以及为每个订单订购的商品。这是表格的细分:
用户
订单
ORDER_ITEMS
在我的用户模型中,我有:
public function orders()
{
return $this->hasMany('Order');
}
public function order_items()
{
return $this->hasManyThrough('OrderItem', 'Order');
}
我的UserController方法如下所示:
public function show()
{
$user = User::find(Auth::user()->id);
return View::make('users/show')->with('user', $user);
}
在'users / show.blade.php'中我试图访问这些关系中的数据,如下所示:
@foreach($user->orders as $order) // this foreach relationship works
{{ $order->order_date }}
@endforeach
我遇到的问题是访问每个订单的商品(order_items)。我在基本的PHP项目上做过类似的事情,但我正在尝试学习和使用Eloquent。我该如何实现这一目标?
答案 0 :(得分:0)
虽然User模型上的hasManyThrough关系没有任何问题,但在这种情况下,最好通过Order模型访问订单商品。
确保您的订单模型具有定义的关系:
class Order extends Eloquent {
public function order_items() {
return $this->hasMany('OrderItem');
}
}
现在,您的观点看起来像:
@foreach($user->orders as $order)
{{ $order->order_date }}
@foreach($order->order_items as $order_item) // order items for this order
{{ $order_item->name }}
@endforeach
@endforeach
附加说明:
这不是必需的,但为了使所有这些数据加载更快,您应该急切加载所有关系以缓解N + 1问题。阅读关于预先加载here的信息。
public function show() {
// eager load the orders and nested order_items records
$user = User::with('orders.order_items')->find(Auth::user()->id);
return View::make('users/show')->with('user', $user);
}
此外,您实际上不需要find
用户。您已拥有Auth::user()
的用户。但是,即使您拥有该用户,仍然希望加载相关记录:
public function show() {
$user = Auth::user();
// load the orders and nested order_items records
$user->load('orders.order_items');
return View::make('users/show')->with('user', $user);
}