laravel - 无论排序如何,Laravel Eloquent 都会将所有返回的列值为 0 的行放在最后
问题描述
我有一个构建器查询,它根据输入的信息提取信息。主要表格是酒店和价格。用户可以按价格从高到低、价格从低到高对结果进行排序。我需要将所有返回 0 的结果(某些价格日期范围的占位符以 0 作为价格)或无论如何都没有价格的酒店放在结果末尾。无论排序如何,我如何处理使它们都显示在最后。我有以下作为我现在所在的位置,但是如果它仅在它的 0 不存在时它不处理事情,但它也不处理将结果放在最后。
还有一件事,我使用分页,否则我只会做一个 foreach 并重新排序它们。
$builder->select('hotels.id','hotels.main_image','hotels.sleeps','hotels.bathrooms','hotels.destination_id','hotels.hotel_name','hotels.slug','hotels.summary','hotels.sleeps','hotels.bedrooms',DB::raw('CASE WHEN max(rates.nightly_rate) = 0 THEN NULL ELSE max(rates.nightly_rate) END AS price_high'),DB::raw('CASE WHEN min(rates.nightly_rate) = 0 THEN NULL ELSE min(rates.nightly_rate) END AS price_low')
->leftJoin('rates', 'hotels.id', '=', 'rates.hotels_id');
解决方案
可以在 order by 子句中强制记录 where nightly_rate
is0
或null
to be 最后排序。
像这样的子句rates.nightly_rates = 0 or rates.nightly_rate IS NULL ASC
将确保符合条件的FALSE
记录在它所在的记录之前首先排序TRUE
。
$builder
->
//...
->orderByRaw('rates.nightly_rate = 0 OR rates.nightly_rate IS NULL ASC');
推荐阅读
- selenium - 如何使用 Selenium 处理错误“在异步脚本期间检测到页面重新加载”
- android - 如何启用新的 Places 自动完成 API
- dialogflow-es - 为什么持久存储在我的谷歌操作中不起作用?
- css - 如何在 5 个元素末尾的第二列上传递一个?
- python - 如果在熊猫数据框中重复,则更改值组的名称
- raspberry-pi - i2cdetect 无法识别 TCA9548A I2C 多路复用器后面的 VL6180X 传感器
- ruby-on-rails - 如何提高 lisibility/split “fat” 类方法(在 ruby 类/rails 模型中)
- ssl - C# JIRA 错误消息:请求被中止:无法创建 SSL/TLS 安全通道
- php - 在 wordpress 中,如何将自定义类型的永久链接结构从 test.com/movies/%name% 更改为 test.com/movies/%name%/%year%
- excel - 如何将(ByVal Target as Range)用于整个工作表的多个范围 - VBA?