【问题标题】:Doing an orderBy through relationship通过关系做订单
【发布时间】:2020-01-20 17:01:45
【问题描述】:

我有一个非常普通的表结构,如下所示:

 Order
,----------,
|id        | 
|order_num |
`----------`

 OrderItem
,---------,
|id       |
|order_id |
|item_id  |
`---------`

 Item
,----------,
|id        |
|item_name |
|price     |
`----------`

经典的Order 表、Item 表,并通过OrderItem 表将项目添加到订单中。但是,我想做的是从 Order 模型中获取由 Item 的 item_name 列排序的 OrderItem 记录列表。

class Order extends Model 
{
     public function order_items()
     {
         return $this->hasMany('App\OrderItem');   <-- How can I get this ordered by the item name?
     }
}

所以它有点像-&gt;orderThrough(如果存在这样的东西的话)。有没有一种干净的方法可以做到这一点?

【问题讨论】:

  • Order::find($x)->order_items->orderBy('xxx');或在关系的定义中
  • 这能回答你的问题吗? Order By on HasMany relationship Laravel 5
  • 应该有...order_items()-&gt;...。请参阅documentation
  • 不完全是,因为我要通过关系增加一层,而不是直接在子表上。这甚至可能不可能像我那样做。我不确定。
  • 从 Order 模型中,我想检索 OrderItem 记录,但我希望它们按项目名称排序。所以这是一种奇怪的嵌套事情。

标签: php laravel eloquent model


【解决方案1】:
class Order extends Model 
{
     public function order_items()
     {
         return $this->hasMany('App\OrderItem')->orderBy('name');
     }
}

【讨论】:

  • 不幸的是,这不起作用。我得到无效的列“名称”。 App\OrderItem 上不存在“名称”列,而是在 App\Item 上。
【解决方案2】:

无需与数据透视表建立关系。你的关系应该被定义为这样的项目:

class Order extends Model 
{
     public function items()
     {
         return $this->hasMany('App\Item', 'OrderItem');
     }
}

现在你可以这样做了:

$order = new App\Order::find(1234);
$items = $order->items()->orderBy('item_name')->get();

如果你真的想要在关系中定义的顺序:

class Order extends Model 
{
     public function items()
     {
         return $this->hasMany('App\Item', 'OrderItem')->orderBy('item_name');
     }
}

$order = new App\Order::find(1234);
$items = $order->items;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2021-02-27
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2014-12-13
    相关资源
    最近更新 更多