Query ordonare in Laravel

De cateva zile ma chinui sa construiesc un query in laravel care imi ordoneze niste anunturi premium si gratuite.

Am asa:
Un model de Anunturi cu id, nume, created_at, etc.
Un model de Plati cu : id, anunt_id, StatusPlata, DataStart, DataEnd, Ordine

Ce vreau sa fac este sa afisez toate anunturile dar incepand cu cele platite (status=Accepte si sa fie in perioada de valabilitate a platii - activ_de_la si activ_pana_la) ordonate dupa coloana ordine, urmate de cele gratuite ordonate dupa created_at. Cred ca acelasi sistem de listare este si pe olx in categorii.

Query builder-ul arata cam asa:

$all = $anunturi
                ->with(
                    ['plati' => function ($query){
                        $query->where('StatusPlata', '=', 'Acceptata');
                        $query->whereDate('DataStart', '<=', date('Y-m-d') );
                        $query->whereDate('DataEnd', '>=', date('Y-m-d') );
                        $query->orderBy('Ordine', 'desc');
                    }]
            )->orderBy('created_at', 'desc');

In varianta de mai sus imi sunt ordonate doar dupa created_at

Multumesc anticipat!

Eu as face doua query-uri separate, unite prin UNION.

2 Likes

Atunci când folosești with (adică eager loading) se face un query separat pt încărcarea datelor pt relație în obiect. Trebuie sa folosești join ca sa poți face ordonarea respectiva.

2 Likes
$all = $anunturi
                ->with(
                    ['plati' => function ($query){
                        $query->where('StatusPlata', '=', 'Acceptata');
                        $query->whereDate('DataStart', '<=', date('Y-m-d') );
                        $query->whereDate('DataEnd', '>=', date('Y-m-d') );
                    }]
            )->orderBy('created_at', 'desc')
->orderBy('plati.Ordine', 'desc');

Poti sa folosesti mai multe conditii de ordonare in query builder ( se face stacking pe ele )
Nu uita sa faci grouping sau sa dai limita la subquery.

Multumesc tuturor, am rezolvat dupa ce am facut un join. Multam @Alin_Ghitu

Las aici query-ul, poate mai ajuta pe cineva.

$anunturi = $anunturi
        ->leftJoin('anunturi_plati', function($join){
            $join->on('anunturi.id', '=', 'anunturi_plati.AnuntID');
            $join->where('anunturi_plati.StatusPlata', '=', 'Acceptata');
            $join->whereDate('anunturi_plati.DataStart', '<=', date('Y-m-d') );
            $join->whereDate('anunturi_plati.DataEnd', '>=', date('Y-m-d') );
        })
        ->select([
            'anunturi.id',
            'anunturi.Nume',
            'anunturi.Oras',
            'anunturi.Categorie',
            'anunturi.Descriere',
            'anunturi.Slug',
        ])
        ->orderBy('anunturi_plati.Ordine', 'ASC NULL LAST')->orderBy('anunturi.created_at', 'desc');
1 Like