Eloquent Laravel 按相关模型排序分页查询

Posted

技术标签:

【中文标题】Eloquent Laravel 按相关模型排序分页查询【英文标题】:Eloquent Laravel sort paginate query by related model 【发布时间】:2019-09-16 05:46:36 【问题描述】:

我有以下 Eloquent 查询。

Company::has('cars')->with([
    'cars', 'location' => function ($q) 
        $q->nearBy(); // *** See futher
    
])->take(40)->paginate(10);

如何按距离订购公司?

*** 这是Location-model 中的 NearBy 范围:

public function scopeNearBy($query)

    $location = json_decode(request()->cookie('location'));
    $query->distance($location->lat, $location->lng); // ** Using package

    return $query->orderBy('distance');

** 使用this package。

距离的计算正常,并且在我调用以下命令时有效。

\App\Address::nearBy()->get()

【问题讨论】:

你有什么错误吗? 请发cars关系。 @JonasStaudenmeir 您可以跳过汽车关系,查询是相同的想法,但不是将汽车添加到响应中 - 这是一个hasmany关系。 @ChamaraAbeysekara 不,查询有效,但它根本不是按位置距离排序的。 @user1469734 如果它与 \App\Address::nearBy()->get() 一起使用,那么您似乎在 scopeNearBy 函数中错误地映射了距离。如果是,那么您能否也提供给我们相关的模型文件?这将帮助我找到问题。 【参考方案1】:

您必须将位置表加入公司查询,然后您可以按距离订购。

【讨论】:

这个。多年来,我希望通过 Eloquent 的简单 orderBy 来解决这个问题,但每次我最终都会像这样进行连接和排序。今天,老实说,我认为这是本地做到这一点的唯一方法。【参考方案2】:

在我看来,唯一的方法是在添加每个位置时存储它们的距离。然后,当然,您可以按距离订购它们。

【讨论】:

【参考方案3】:

如果您可以使用该软件包找到距离。将距离附加到您的公司模型。

然后你就可以轻松的在控制器中对集合进行排序了

参考https://laravel.com/docs/5.8/collections#method-sortby

【讨论】:

以上是关于Eloquent Laravel 按相关模型排序分页查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 模型按局部列和关系模型列值排序

Laravel Eloquent:如何排序相关模型的结果?

列表模型如何按 DOWN-VOTES 的数量排序到相关模型 - laravel,雄辩

Laravel Eloquent在相关模型上按范围获取模型

Laravel Eloquent 按关系计数排序

Laravel Eloquent按关系表列排序