【问题标题】:Laravel Query StructureLaravel 查询结构
【发布时间】:2015-01-19 04:50:36
【问题描述】:

我是 Laravel 的新手,正在尝试创建一个复杂的、雄辩的查询,但是我一生都无法弄清楚如何去做!这是使用多供应商商店结构。

我有以下型号:

用户有很多产品
产品有很多 OrderItem
OrderItems 属于 To Order
订单属于用户

用户可以有自己的产品,也可以有自己的订单。每个订单都有多个订单项目,每个订单项目都有一个与之关联的产品。

当我想通过传回单个订单对象来获取它时,我可以执行以下操作:

Order::with('OrderItems', 'OrderItems.Product', 'OrderItems.Product.User')
     ->whereUser_id($this->user_id)->first();

这为我提供了我需要的所有信息,但如果我想以相反的顺序获得完全相同的信息,我该怎么做,例如......

User::with('Products', 'Products.OrderItem', 'Products.OrderItem.Order')
    ->where('Order.order_id', '=', 1)->get();

有人可以指出正确的方法吗?我已经尝试过DB::Raw,但显然这会返回一个平坦的响应而不是对象。这是目前实现这一目标的最佳方式吗?

【问题讨论】:

  • 第二个查询不行?顺便Order::with('OrderItems.Product.User')就够了
  • 告诉我们您想要实现的目标。现在您没有具体说明第一个查询,更不用说第二个了。显然后者是不行的,因为没有join,所以查询users的时候不能引用orders表。
  • lukasgeiter - 不,第二个查询不起作用,它只是表明我要达到的目标
  • Jarek Tkaczyk - 我已经完成了,我正在尝试从第一个查询中获取相同的信息,但相反。所以我应该得到一个用户对象数组,其中包含嵌套的产品、订单项和订单对象,但只有在它们与特定订单相关联时才包含在内。所以我不希望用户销售的任何其他产品出现。这是否更有意义?谢谢
  • lukasgeiter - 也感谢关于 Order::with('OrderItems.Product.User') 的注释,我看到其他人把它完整地写出来了!

标签: laravel eloquent


【解决方案1】:

不确定这是否是您想要的,但您可以使用 with()(带有闭包)和 whereHas() 的组合:

User::with(['Products.OrderItem.Order' => function($q){
    $q->where('Order.order_id', 1);
}])
->whereHas('Products.OrderItem.Order', function($q){
    $q->where('Order.order_id', 1);
})
->get();

with() 将只加载 id 为 1 的订单,whereHas 将过滤掉所有没有 id 为 1 的订单的用户。

【讨论】:

  • 啊,我明白了,所以这是一个两步过程。使用 with 获取所有数据,然后使用 whereHas 进行过滤。对我来说 with 方法有效,但 whereHas 仅在我删除除第一个关系之外的所有内容时才有效。 $users = User::with(array('Products.OrderItems.Order' => function($q){ $q->where('orders.id', 4); })) ->whereHas('Products', function($q){ $q->where('Products.id', 92); }) ->get();它的投掷Call to undefined method Illuminate\Database\Query\Builder::Products.OrderItems.Order()到目前为止感谢您的帮助,它对我的​​理解帮助很大!
  • 更新你的 Laravel 安装 (composer update)。最近添加了对 whereHas 嵌套关系的支持。
  • 啊,谢谢lukasgeiter,我可以从@Jarek 的评论on this answer 中看到它仍在开发中,这就是为什么我现在没有它的原因谢谢你们的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2020-07-18
  • 2017-01-07
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多