HasManyThrough的雄辩方法

时间:2015-05-03 23:38:06

标签: laravel-4 eloquent

我一直试图找出这个问题好十个小时,我不知道我哪里出错了。我希望订单中的商品根据他们与订单的关系来显示。

我有3个表,我需要在加载用户个人资料页面时提供信息。在该页面上,我试图显示先前的订单(即:订单日期)以及为每个订单订购的商品。这是表格的细分:

用户

  • ID

订单

  • ID
  • 订单日期
  • USER_ID

ORDER_ITEMS

  • ORDER_ID

在我的用户模型中,我有:

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。我该如何实现这一目标?

1 个答案:

答案 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);
}