如何使用 foreach 循环在 laravel 控制器 return 值中按姓氏排序

How to order by last name in laravel controller return value using foreach loop

I tried to put orderBy(hr_workers.l_name) before get() but it's not working.. also tried to put it on $workers but still not working... I don't have any idea why isn't working... anyone can help me all answer must be appreciated thanks in advance

我希望结果按姓氏字母顺序排列

public function show6($id)
    {

    $workers = DB::table('hr_workers')
    ->select('wrk_id','f_name','m_name','l_name');

    $attendance = DB::table('payroll_daily_attendance')->where('payroll_daily_id', $id)
    ->select('payroll_daily_attendance.*','f_name','l_name','m_name')
    ->rightjoinSub($workers,'worker', function($join){
        $join->on('payroll_daily_attendance.wrk_id','=','worker.wrk_id');
    });
   
    $payroll = DB::table('payroll_daily_details')
    ->select('payroll_daily_details.*','wrk_id','f_name','m_name','l_name','attendance.*')
    ->rightjoinSub($attendance,'attendance', function($join){
        $join->on('payroll_daily_details.payroll_daily_id','=','attendance.payroll_daily_id');
    })
    
    ->get();

    $fetch = [];
    foreach($payroll as $key){
         if(!isset($fetch[$key->wrk_id]['total_ot']) && !isset($fetch[$key->wrk_id]['total_days']) && !isset($fetch[$key->wrk_id]['grand_total'])){
            $fetch[$key->wrk_id]['total_ot'] = 0;
            $fetch[$key->wrk_id]['total_days'] = 0;
            $fetch[$key->wrk_id]['total_allowance'] = 0;
            $fetch[$key->wrk_id]['grand_total'] = 0;
          }
            $fetch[$key->wrk_id]['wrk_id'] = $key->wrk_id;
            $fetch[$key->wrk_id]['f_name'] = $key->f_name;
            $fetch[$key->wrk_id]['l_name'] = $key->l_name;
            $fetch[$key->wrk_id]['m_name'] = $key->m_name;
            $fetch[$key->wrk_id]['total_days'] += $key->reg_hour + $key->adj_hour;
            $fetch[$key->wrk_id]['total_allowance'] += $key->allowance;
         
          
      }
      return $fetch;


    }

使用:

$payroll = DB::table('payroll_daily_details')
->select('payroll_daily_details.*','wrk_id','f_name','m_name','l_name','attendance.*')
->rightjoinSub($attendance,'attendance', function($join){
    $join->on('payroll_daily_details.payroll_daily_id','=','attendance.payroll_daily_id');
})
->orderBy('l_name')
->get();

正如 Euclides Cardoso Junior 强调的那样。我相信您要按字母顺序排列结果,您需要将第二个参数放在 orderBy 函数中以包含要遵循的顺序,并按函数进行分组。检查下面的代码;
$yourQuery->orderBy('l_name', 'asc') ->groupBy('l_name') ->get();

希望这对您有所帮助。

因为可以有多个 l_name 值与 $fetch 数组中的每个 wrk_id 关联,查询中的任何 l_name 排序都将被覆盖,因为方式正在生成 $fetch 数组。您需要在 return 之前按 l_name 值对 $fetch 数组进行排序,您可以使用此方法(派生自 this Q&A):

usort($fetch, function($a, $b) { return $a['l_name'] <=> $b['l_name']; });