Первая запись по id остальные по популярности?

Есть код, который подтягивает записи с базы по популярности:

public function index(Request $request)
{

    $colors = Color::where([['in_stock', '=', '1']])
                   ->orderBy('popularity', 'desc')
                   ->get();
    
    return view('color.index', compact('colors'));
}

Как модифицировать, чтобы в случае наличия get-параметра с id и наличие такого id в базе он был первый, а все последующие по популярности?

site.local/?сolor=id

Ответы (1 шт):

Автор решения: Total Pusher

Попробуйте это. Тут используется две сортировки, первая - по условию, которая в случае совпадения id выставляет порядок 1, а для остальных - 2. А вторая сортировка уже дополнительно сортирует "двойки".

$colors = Color::where([['in_stock', '=', '1']])
            ->orderByRaw(sprintf("CASE id
                WHEN %d THEN 1
                ELSE 2
            END", $id)) // ваш ID из запроса
            ->orderBy("popularity", "desc")
            ->get();
→ Ссылка