You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel如何对关联模型集合按房间数组价格排序?

解决Laravel集合按关联数组中price排序的问题

嘿,这个问题我之前也碰到过!原因很简单——你的room是一个数组(或者Laravel集合),不是单个对象,所以直接用->price肯定会报错,因为数组本身没有这个属性。下面分几种常见场景给你解决方案:

场景1:按room数组中第一个元素的price排序

如果你的需求是取每个酒店room数组里第一个房间的价格来排序,那你原来的思路是对的,但最好加上空值判断,避免当room数组为空时报错:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    // 判断room集合/数组是否有内容,空的话把它排到最后(用PHP_INT_MAX)
    return $deal->hotel->room->isNotEmpty() ? $deal->hotel->room[0]->price : PHP_INT_MAX;
});

如果room是普通PHP数组而非Laravel集合,改成这样:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    $rooms = $deal->hotel->room;
    return !empty($rooms) ? $rooms[0]['price'] : PHP_INT_MAX;
});

场景2:按room数组中的最低价格排序

如果想按每个酒店所有房间里的最低价格排序,可以利用Laravel集合的min方法:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    $rooms = $deal->hotel->room;
    return $rooms->isNotEmpty() ? $rooms->min('price') : PHP_INT_MAX;
});

若room是普通数组,用array_column提取价格后取最小值:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    $roomPrices = array_column($deal->hotel->room, 'price');
    return !empty($roomPrices) ? min($roomPrices) : PHP_INT_MAX;
});

场景3:按room数组中的最高价格排序

和最低价格逻辑类似,换成max方法即可:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    $rooms = $deal->hotel->room;
    return $rooms->isNotEmpty() ? $rooms->max('price') : PHP_INT_MAX;
});

普通数组版本:

$greatDeals = $greatDealsinitial->sortBy(function ($deal) {
    $roomPrices = array_column($deal->hotel->room, 'price');
    return !empty($roomPrices) ? max($roomPrices) : PHP_INT_MAX;
});

小提示:如果想倒序排序,把sortBy换成sortByDesc就可以啦!

内容的提问来源于stack exchange,提问作者arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:31:00