Если id нет в get-параметре (строка) или в сессии (массив), то выводим по популярности все цвета, которые есть в наличии. Если в get-параметре есть id, то этот цвет должен быть первым. Если в get-параметре есть id и в сессии есть масса id, то первый должен быть цвет по get-параметру, потом цвета из массива сессии и только потом все остальные цвета. При этом, все цвета должны сортироваться по популярности и быть в наличии.
Сейчас у меня проверяется только наличие get-параметра.
public function index(Request $request)
{
$colors_ids = $request->session()->get('colors_ids');
$this->validate($request, [
'color' => 'numeric',
]);
$colors = Color::where([['in_stock', '=', '1']])
->orderByRaw(sprintf("CASE id WHEN %d THEN 1 ELSE 2 END", $request->get('color')))
->orderBy("popularity", "desc")
->get();
return view('color.index', compact('colors'));
}