Php 使用laravel按数字排序集合,然后按空数字排序集合
我有一个集合,我需要按总计(从最低到最高)排序,如果客户没有总计(-),请将其保留在有总计的客户下方 集合返回以下内容: 我的目的是实现下一个结果(首先是有总计的客户,然后是没有总计的客户): 我尝试使用Php 使用laravel按数字排序集合,然后按空数字排序集合,php,laravel,sorting,collect,Php,Laravel,Sorting,Collect,我有一个集合,我需要按总计(从最低到最高)排序,如果客户没有总计(-),请将其保留在有总计的客户下方 集合返回以下内容: 我的目的是实现下一个结果(首先是有总计的客户,然后是没有总计的客户): 我尝试使用sortBy('total'),但它对我不起作用 解决方案: $sales = Sale::with('client') ->get() ->map(function($sale){ $sale['total
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;
});
谢谢你的帮助。关于您只需通过asc订购即可:
$sales = Sale::select('total', 'client_id')
->with(['client'=>function($query){
$query->orderBy('total', 'ASC');
}])
->get();
编辑:
$sales = Sale::select('total', 'client_id')
->with('client')
->orderBy('total', 'ASC')
->get();
我认为,如果要按关系排序,则需要使用SQL“join”,因为with()将在之后立即加载结果(如果需要立即加载客户端,则仍然可以使用with()) 使用连接
Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();
不确定外国的名字和东西,但你知道了
使用排序(在您的收藏中)
您应该更喜欢解决方案1(JOIN),因为第二个解决方案需要数据库查询+集合处理
编辑:您可以执行更复杂的join语句
Edit2:选中orderByRaw('-total DESC')尝试此选项我在集合中使用“map”创建的“total”字段,因此我无法使用orderBy。谢谢。您能告诉我们您的表(哪些字段)
sales
和表clients
的样子吗?字段“total”属于“sales”表,而不是“clients”。ThanksIt无助于应用“orderB”y,因为“total”字段是在集合中使用“map”获得的。我必须使用“sortBy”或“sort”将订单标准应用于集合。Thanks@CristianMeza然后使用map添加整个查询和修改。嵌套的orderBy将仅由每次销售的客户orderBy。不是销售人员本身。@Leorent编辑我的回答我不能使用join,因为我在集合中使用“map”得到“total”字段。我必须将订单if或if应用于收款。谢谢。啊,是的,我明白了。因此,在映射之后,需要对集合进行排序。
Sale::select('total', 'client_id')->join( 'client', 'client.sale_id', '=', 'sale.id' )>orderBy( 'client.total', 'ASC' )->get();
$data->sortBy('client.total');