【问题标题】:Eloquent method for HasManyThroughHasManyThrough 的 Eloquent 方法
【发布时间】:2015-07-13 06:40:06
【问题描述】:

我花了整整十个小时试图解决这个问题,但不确定我哪里出错了。我希望根据它们与订单的关系显示订单中的商品。

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

用户

  • 身份证

订单

  • 身份证
  • 订单日期
  • 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。我该如何实现呢?

【问题讨论】:

    标签: laravel-4 eloquent


    【解决方案1】:

    虽然 User 模型上的 hasManyThrough 关系没有任何问题,但在这种情况下,最好通过 Order 模型访问订单商品。

    确保您的 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);
    }
    

    【讨论】:

    • 非常感谢!你是救生员。实际上,我在 Order 模型中有确切的代码,但让它工作的关键是急切加载。尝试在嵌套的 foreach 中调用 order_items 方法会导致为 foreach() 提供的参数无效。再次感谢。如果我有更多的声誉,我很乐意给 +1。希望其他人会发现这很有用。
    猜你喜欢
    • 2014-08-14
    • 2020-03-07
    • 2016-09-24
    • 2020-10-14
    • 2016-08-21
    • 2020-02-02
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多