首页 > 解决方案 > 无论排序如何,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');

标签: laraveleloquentlaravel-5.5

解决方案


可以在 order by 子句中强制记录 where nightly_rateis0nullto 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');

推荐阅读