【问题标题】:Sort the results returned by model relation laravel对模型关系 laravel 返回的结果进行排序
【发布时间】:2021-02-10 14:11:43
【问题描述】:

我有 2 张桌子:

products: id, name
auctions: id, product_id, expired_time

模型产品

function getAuctions(){
    return $this->hasOne('App\Models\Auction', 'product_id', 'id');
}

我该如何执行以下操作(auctions.expired_time 不起作用):

Controller
function getProductAuctions(){
    return \App\Models\Product::with('getAuctions')->whereHas('getAuctions', function(){})->orderBy('auctions.expired_time', 'asc');
}

谢谢大家。

【问题讨论】:

  • 这能回答你的问题吗? laravel eloquent sort by relationship
  • 您的getAuctions() 关系不应该被称为getAuction(),因为它只能返回一次拍卖,或者更好地遵循Laravel 最佳实践,它应该被称为auction()

标签: laravel


【解决方案1】:

您可以使用sortBy() 方法来做到这一点。该方法仅适用于集合。

function getProductAuctions(){
    $products = \App\Models\Product::all();
    return $products->sortBy(function ($product, $key) {
         return  $product->getAuctions->expired_time;
    })
}

现在应该按照拍卖过期时间对您的产品集合进行排序,如果您想要颠倒顺序,您可以使用sortByDesc() 方法,其余相同。此外,在您的产品模型中,如果您有 hasOne() 关系,请将函数名称重命名为 getAuction() 或更好的 auction()(单数)。

【讨论】:

  • 对集合进行排序(循环每条记录)而不是通过查询来进行排序非常低效,这会禁用许多雄辩的功能,例如分页等。
  • @AnNguyễn,如果它解决了您的问题,请投票并批准答案,以便其他人知道。谢谢! :)
【解决方案2】:

您可以使用其中之一来对结果进行排序 在您的控制器中

function getProductAuctions(){
    return \App\Models\Product::with('getAuctions')->whereHas('getAuctions', function($query){
$query->orderBy('expired_time', 'asc');
})->get();
}

如果你想在你的模型中排序,那么就使用这个

function getAuctions(){
    return $this->hasOne('App\Models\Auction', 'product_id', 'id')->orderBy('expired_time', 'asc');
}

这一切都不需要做任何事情......你的结果已经排序

【讨论】:

  • 结果不是我想要的,它只是对关系表进行排序
【解决方案3】:

谢谢大家。我在这里找到了答案,我发现它是正确的:https://laracasts.com/discuss/channels/eloquent/order-by-on-relationship “当你使用 with 方法时,Eloquent 在数据库中进行另一个查询以使用 whereIn 检索相关数据。这就是为什么我们不能按关系字段排序的原因。”

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2018-09-19
    • 2019-05-27
    • 2019-12-22
    • 2016-08-14
    • 2019-07-17
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多