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
相关产品推荐
相关产品推荐

