【问题标题】:Sorting via table relation's in laravel通过 laravel 中的表关系排序
【发布时间】:2019-11-09 19:53:35
【问题描述】:

我有一个包含 User 和 Order 模型的 Laravel 项目。 用户模型与排序模型的关系如下:

public function last_order() {
   return $this->hasOne('Order', 'user_id')->orderBy('created_at', 'desc')->limit(1);
}

这将返回特定用户的最后一个订单。它工作正常。

我还需要从最新的订单返回排序的用户数组。我尝试在存储库层上使用 Eloquent 来做到这一点:

User::has('last_order')->with('last_order')->orderBy('last_order.created_at', 'desc')->get();

它不起作用。我也尝试了 sortBy 方法,结果相同。它返回给我,last_order 表不存在。

您能否建议我,如何使用 Eloquent(不在服务层,并且没有原始选择)轻松地对这样的一些进行排序?

谢谢。

【问题讨论】:

  • 订单表的名称是什么?

标签: laravel eloquent eloquent-relationship


【解决方案1】:

我想到了:

public function scopeLasorder($query)
{
    return $query->join(
        with(new Orden())->getTable(), 'user_id', '=', 'id' //id de User
    )->whereNotNull('last_order');
}

并执行

User->lastorder->orderBy(new Orden())->getTable().'.created_at', 'desc')

【讨论】:

    【解决方案2】:

    sortBy() 使用点符号get() 集合之后效果很好。

    User::has('last_order')->with('last_order')->get()->sortByDesc('last_order.created_at');
    

    我还注意到last_order() 关系已经排序。除非您创建不将返回限制为 1 且未预先排序的不同关系,否则这将不起作用。

    【讨论】:

    • 是的,你有权利。它不适用于已经排序的关系。现在我找到了解决方案(就像我之前尝试过的不同的访问方式),我会添加它来回答。无论如何,谢谢你的回答(+1)
    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2017-03-01
    • 1970-01-01
    • 2014-09-27
    • 2019-02-17
    • 2014-06-25
    • 2019-05-14
    • 2020-07-10
    相关资源
    最近更新 更多