0

I have a right now simple $ads query, but I need to add more complexity to it for a richer ordering result.

I have an index() method at AdsController, so I list a lot of ads ordered by last updated date. So, I need to order it first by a linked model called promo.promotype (which goes from 1 to 4 values), then later order by the updated_at parameter in Ad Model.

This is the actual query:

        $query = Ad::query();
        $query->where('category_id', $sub_category->category_id)->with(['description', 'resources', 'category.description', 'category.parent.description', 'promo', 'stats']);

        //Bunch of conditions here? ...

        //Minimal Price
        if (null !== Input::get('min_price')) {
            $query->when(request('min_price') >= 0, function ($q) {
                return $q->where('price', '>=', request('min_price', 0));
            });
        }


        //Maximum Price
        if (null !== Input::get('max_price')) {
            $query->when(request('max_price') >= 0, function ($q) {
                return $q->where('price', '<=', request('max_price', 0));
            });
        }


        //Order
        $query->orderBy('updated_at', 'desc');

        $ads = $query->get();

So, I need to order results first from the promotype column at AdPromo Model (set as hasOne in Ad Model)

I need these results:

ads.poromotype = 4 (random between them)
ads.poromotype = 3 (random between them)
ads.poromotype = 2 (random between them)
ads.poromotype = 1 (random between them)
ads.poromotype = null (orderred by updated_at)

This has a big importance for me, but I just don't know hoy to achieve, thanks!

Erich García
  • 1,648
  • 21
  • 30

1 Answers1

0

You need to use join() to order by a relation column. Be caseu the "with" does not actually use join but add another query used to fill your relation data

Have a look there Order by relationship column, it is pretty straight forward :)