简体   繁体   中英

When doing two queries and a merge in Laravel 8, it doesn't sort by expiration date if i use sortBy or sortByDesc

I have made 2 queries to two different tables with with(), and then I have joined them with a merge. But I also want them to be displayed in order of expiration date.

As I have done the orderBy, it is not working for me. what will i be doing wrong? I would appreciate any help. Thank you and sorry for my english:(

Controller:

    public function listado_pendientes(Request $request)
  {
    $incio = Carbon::parse($request->fecha_inicio);
    $fin = Carbon::parse($request->fecha_fin);

    $datecheck =  $incio > $fin ? $fin : $incio;
    
    $dateStart = $datecheck && $datecheck < now() ? $datecheck : now();   
    $dateEnd = $fin && $fin < now() ? $fin : now();   

    // cargo relación de cobros con clientes según las fechas buscadas
    $cobros = Cobro::with('Contrato')
      ->whereBetween('vencimientos', [$dateStart,$dateEnd])     
      ->get();

    // cargo relación de facturas con clientes, según fechas buscadas y que no hayan sido cobradas
    $facturas = Factura::with('Contrato')
      ->whereBetween('vencimientos', [$dateStart,$dateEnd])
      ->where('cobrado', '=', NULL)      
      ->get();
    //dd($cobros);              
    $data = []; 
    $data = $cobros->merge($facturas);
    
    $data = collect($data)->sortByDesc('vencimientos');       

    return Voyager::view('voyager::custom.listado_pendientes', compact('data', 'dateStart','dateEnd'));
  }

Blade

 <tbody>
                                @foreach ($data as $cobro)
                                    <tr>                                                        
                                        <td>{{ $cobro->Contrato ? $cobro->Contrato->cliente : '' }}</td>
                                        <td>{{ $cobro->Contrato ? $cobro->Contrato->codigo : ' '}}</td>
                                        <td>{{ $cobro->Contrato ? $cobro->Contrato->full_address : ''}}</td>
                                        <td>{{ \Carbon\Carbon::parse($cobro->vencimientos)->format('d-m-Y') }}</td>
                                        <td>{{ $cobro->factura ? 'Factura ' : 'Cobro ' }}</td>
                                        <td>{{ $cobro->factura ? $cobro->factura : $cobro->id }}</td>
                                        <td>{{ $cobro->total }}</td>
                                    </tr>
                                @endforeach
                            </tbody>

dd, look the field "vencimientos"

 array:10 [▼
  6 => array:25 [▼
    "id" => 81185
    "idcliente" => 12421
    "factura" => 40621
    "fecha" => "2022-02-21"
    "baseimponible" => "23.00"
    "iva" => "4.83"
    "idiva" => 5
    "total" => "27.83"
    "vencimientos" => "2022-03-09"
    "domiciliaciones" => null
    "ccc" => null
    "observaciones" => null
    "autonomo" => null
    "razonsocial" => null
    "conceptos" => "POR SERVICIOS DE DESINSECTACION Y DESRATIZACION SEGÚN CONTRATO"
    "importes" => null
    "codigocliente" => null
    "formapago" => null
    "estado" => null
    "plazo" => "1"
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => null
    "contrato" => array:76 [▶]
  ]
  9 => array:25 [▼
    "id" => 81199
    "idcliente" => 5459
    "factura" => 40635
    "fecha" => "2022-03-07"
    "baseimponible" => "148.00"
    "iva" => "31.08"
    "idiva" => 5
    "total" => "179.08"
    "vencimientos" => "2022-03-09"
    "domiciliaciones" => null
    "ccc" => null
    "observaciones" => null
    "autonomo" => null
    "razonsocial" => null
    "conceptos" => "POR SERVICIOS DE DESINSECTACION SEGÚN CONTRATO"
    "importes" => null
    "codigocliente" => null
    "formapago" => null
    "estado" => null
    "plazo" => null
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => null
    "contrato" => array:76 [▶]
  ]
  5 => array:25 [▼
    "id" => 81184
    "idcliente" => 12421
    "factura" => 40620
    "fecha" => "2022-02-21"
    "baseimponible" => "54.00"
    "iva" => "11.34"
    "idiva" => 5
    "total" => "65.34"
    "vencimientos" => "2022-03-05"
    "domiciliaciones" => null
    "ccc" => null
    "observaciones" => null
    "autonomo" => null
    "razonsocial" => null
    "conceptos" => "POR SERVICIOS DE DESINSECTACION SEGÚN CONTRATO"
    "importes" => null
    "codigocliente" => null
    "formapago" => null
    "estado" => null
    "plazo" => "3"
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => null
    "contrato" => array:76 [▶]
  ]
  7 => array:25 [▼
    "id" => 81191
    "idcliente" => 15869
    "factura" => 40627
    "fecha" => "2022-02-23"
    "baseimponible" => "89.86"
    "iva" => "23.89"
    "idiva" => 5
    "total" => "113.75"
    "vencimientos" => "2022-03-04"
    "domiciliaciones" => null
    "ccc" => null
    "observaciones" => null
    "autonomo" => null
    "razonsocial" => null
    "conceptos" => "POR NUESTRO SERVICIO DE CONTROL DE PLAGAS"
    "importes" => null
    "codigocliente" => null
    "formapago" => null
    "estado" => null
    "plazo" => "4"
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => 1
    "contrato" => array:76 [▶]
  ]
  8 => array:25 [▼
    "id" => 81198
    "idcliente" => 5459
    "factura" => 40634
    "fecha" => "2022-03-04"
    "baseimponible" => null
    "iva" => "0.00"
    "idiva" => 5
    "total" => "0.00"
    "vencimientos" => "2022-02-17"
    "domiciliaciones" => null
    "ccc" => null
    "observaciones" => null
    "autonomo" => null
    "razonsocial" => null
    "conceptos" => "POR SERVICIOS DE DESINSECTACION SEGÚN CONTRATO"
    "importes" => null
    "codigocliente" => null
    "formapago" => null
    "estado" => null
    "plazo" => null
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => null
    "contrato" => array:76 [▶]
  ]
  2 => array:25 [▼
    "id" => 63464
    "idcliente" => 4132
    "factura" => 27172
    "fecha" => "2016-02-22"
    "baseimponible" => "-282.65"
    "iva" => "-59.36"
    "idiva" => 5
    "total" => "-342.01"
    "vencimientos" => "2022-02-16"
    "domiciliaciones" => ""
    "ccc" => ""
    "observaciones" => ""
    "autonomo" => 1
    "razonsocial" => 1
    "conceptos" => ""
    "importes" => ""
    "codigocliente" => null
    "formapago" => "REBUT DOMICILIAT 15-8-15 CTA ES46.0075.0081.6106.01313202"
    "estado" => ""
    "plazo" => null
    "tipopagos_id" => null
    "cobrado" => null
    "emailed" => null
    "remesada" => null
    "contrato" => array:76 [▶]
  ]
  0 => array:11 [▼
    "id" => 254
    "idcliente" => 8383
    "vencimientos" => "2022-02-09"
    "conceptos" => "POR SERVICIOS DE DESINSECTACION SEGÚN CONTRATO"
    "plazo" => null
    "total" => "102.85"
    "observaciones" => null
    "idiva" => 5
    "iva" => "17.85"
    "baseimponible" => "85.00"
    "contrato" => array:76 [▶]
  ]

You can use the method of PHP multisort for DESC or ASC sorting, it is for sorting multiple or multi-dimensional arrays:

  $array_multisort(array_map('strtotime',array_column($array,'vencimientos')),SORT_DESC,$array);

I found the problem. It is that I am using datatable, which was ordering the table, I have fixed it and now it works with a simple sortByDesc('vencimientos'). I leave the code of the datatable that I have changed. I add the 'bSort'=> false

 array_merge(
                [   
                    'bSort' => false,                   
                    'paging' => false,
                    'language' => __('voyager::datatable'),                    
                    'columnDefs' => [['targets' => 'dt-not-orderable', 'searchable' => false, 'orderable' => false]],
                ],

When you sort collection by keys it will have structure like this:

[
  "0": [COLLECTION],
  "1": [COLLECTION],
  "2": [COLLECTION],
  "3": [COLLECTION],
  ...
]

So, when you return this it will be sorted by keys. You have to get values of that collections.

So, in your case you have to add ->values() method:

$data = collect($data)->sortByDesc('vencimientos')->values();       

Or if it doesn't work try this:

$data = collect($data)->sort(function ($a, $b) {
  return strtotime($a->vencimientos) < strtotime($b->vencimientos);
})
->values();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM