php - 使用 laravel 按数字排序集合,然后按空数字排序
问题描述
我有一个集合,我需要按总数(从最低到最高)排序,如果客户没有总数 (-),请将其放在有总数的客户下方。
该集合返回以下内容:
我的意图是实现下一个结果(首先是有总数的客户,然后是没有总数的客户):
$sales = Sale::with('client')
->get()
->map(function($sale){
$sale['total'] = $sale->total ? $sale->total * $sale->quantity : '--';
return $sale;
});
我尝试使用sortBy('total')
,但它对我不起作用。
解决方案:
$sales = Sale::with('client')
->get()
->map(function($sale){
$sale['total'] = $sale->total ? $sale->total * $sale->quantity : '--';
return $sale;
})
->sort(function($a, $b) {
if ($a->total == "--" && $b->total != "--") {
return 1;
}
if ($a->total != "--" && $b->total == "--") {
return -1;
}
if ($a->total == "--" && $b->total == "--") {
return 0;
}
return $a->total - $b->total;
});
谢谢您的帮助。问候
解决方案
我认为如果你想通过关系订购,你需要使用 SQL “join”,因为 with() 将在之后急切加载结果(如果你需要急切加载客户端,你仍然可以使用 with() )。
使用 JOIN
Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();
不确定外国名字和东西,但你明白了。
使用排序(在您的收藏中)
$data->sortBy('client.total');
您应该更喜欢解决方案 1 (JOIN),因为第二种解决方案需要数据库查询 + 收集处理。
编辑:你可以做更复杂的连接语句
Edit2:检查这个堆栈
推荐阅读
- github - Adding github pages to all subfolders?
- javascript - 在 React Native 中使用带有维度的 flex 时设计中断
- javascript - 在 React App 中更新 serviceworker - 成功更新 - 但刷新时显示旧代码仍然使用新 serviceworker?
- c# - 使用 LINQ 从类中添加列表视图
- android - MPAndroidChart 给出奇怪的 x 轴值
- enums - SwiftUI - 选择器
- android - 将颜色阴影拖放到 Xamarin 中的按钮
- vue.js - 没有嵌套的动态 v 模型
- sql - sql查询喜欢在列表顶部排序完全匹配
- swift - 如何从 NSDecimalNumber 中获取绝对值?