Проблема с фильтрацией данных перед отправкой на view
Я пытаюсь отфильтровать данные перед отправкой на вьюху через DB::raw но вылетает ошибка (Call to a member function orderBy() on array) в этом месте
if ($request->input('order') == 'complexity asc') {
$recipesQuery->orderBy('difficulty', 'asc');
}
Вот полный кусок кода
public function index(Request $request) {
$recipesQuery = Recipe::query();
$ingredients = DB::table('ingredients')->get();
if($request->input('ingredients')){
$all = $request->input('ingredients');
$rest = $request->input('ingredients');
$first = array_shift($rest);
$tmp = "";
foreach ($rest as $value) {
$tmp = $tmp . "OR ingredient_id = " . $value . " ";
};
if (count($all) == 1) {
$recipesQuery = DB::select(DB::raw("SELECT r.name,
r.preparing,
r.difficulty
FROM recipes r
WHERE EXISTS (SELECT recipe_id FROM recipeingredients ri
WHERE r.id = ri.recipe_id
AND ingredient_id = '$first')"
),
array('first' => $first)
);
} else {
$recipesQuery = DB::select(DB::raw("SELECT r.name,
r.preparing,
r.difficulty
FROM recipes r
WHERE EXISTS (SELECT recipe_id FROM recipeingredients ri
WHERE r.id = ri.recipe_id
AND ingredient_id = '$first'" . $tmp . ")"
),
array('first' => $first)
);
}
}
if ($request->filled('order')) {
if ($request->input('order') == 'complexity asc') {
$recipesQuery->orderBy('difficulty', 'asc');
} elseif ($request->input('order') == 'complexity desc') {
$recipesQuery->orderBy('difficulty', 'desc');
} elseif ($request->input('order') == 'preparing asc') {
$recipesQuery->orderBy('preparing', 'asc');
} elseif ($request->input('order') == 'preparing desc') {
$recipesQuery->orderBy('preparing', 'desc');
} elseif ($request->input('order') == 'date desc') {
$recipesQuery->orderBy('preparing', 'desc');
} elseif ($request->input('order') == 'date asc') {
$recipesQuery->orderBy('preparing', 'asc');
}
}
$recipe = $recipesQuery->paginate(3);
return view('index', ['data' => $ingredients, 'recipes' => $recipe]);
}
Мне кажется что нужно заменить выражение с raw на eloquent и это должно заработать,я попробовал и вот что получилось
DB::table('recipes')
->select('recipes.name', 'recipes.preparing', 'recipes.difficulty')
->whereExists(function ($query) use($first, $rest) {
$query->select(DB::raw(1))
->from('recipeingredients')
->whereRaw('recipes.id = recipeingredients.recipe_id')
->whereRaw('recipeingredients.ingredient_id = ?', array($first));
})
->groupBy('name', 'preparing', 'difficulty')
->get();
Только остается вопрос как заставить это работать с несколькими айдишниками, чтобы они подставлялись в формате
$tmp = "";
foreach ($rest as $value) {
$tmp = $tmp . "OR ingredient_id = " . $value . " ";
};