Задать вопрос

Можно ли как то оптимизировать запросы в контроллере?

Добрый вечер, подскажите, все эти данный нужно отобразить на странице, понимаю что в контроллере слишком много запросов. Как это можно исправить? Может через ресурсы, но не понимаю как. Буду признателен за помощь
class IndexController extends Controller
{
    public function index()
    {
        $user = User::all();
        $users = $user->count();
        $performer = $user->where('role_id', 1)->count();
        $customer = $user->where('role_id', 2)->count();

        $sumBalance = 0;
        foreach ($user as $value) {
            $sumBalance += $value->balance;
        }
// Tasks
        $tasks = Task::where('status', 1)->get();
        $orders = Order::where('status', 0)->get();
        $ordersWin = Order::where('status', 2)->get();

// Orders
        $ordersAllWin = Order::where('status', 2)->get();

        return Inertia::render('Admin/Index');
    }
}
  • Вопрос задан
  • 386 просмотров
Подписаться 5 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 3
@vlog
Я, конечно, не суперэксперт, но, мне кажется, у вас не особо громоздкий код в этом месте. Я бы сделал так:

Цикл с суммой можно заменить этим:
$sumBalance = $user->sum('balance');
Подробнее о коллекциях и методах можно почитать тут. Но это если вам будет нужна $user в чистом виде в представлении, если они не будут Вам нужны, то можно вообще не запрашивать всех пользователей из бд, а использовать агрегатную функцию sum()

$ordersWin и $ordersAllWinидентичны, не понимаю в чем разница. Если хотите оптимизировать запросы, то можно сначала получить записи со статусами 1 и 2 с помощью одного запроса, а затем группировать по статусам используя метод groupBy.

Кроме того, возможно, Вы специально скрыли это, чтобы вопрос не был большим, но Ваши данные не передаются в приложение сейчас. Для того, чтобы они передавались Вы должны во втором аргументе render передать массив с данными:
Inertia::render('Admin/Index', [
'key' => $value,
]);


Рекомендую почитать о коллекциях, там есть полезные вещи. Также, если хотите оптимизировать взаимодействие с бд, рекомендую использовать метод select и запрашивать только те столбцы, которые Вам нужны.
Ответ написан
Комментировать
@lil_koi
лучший из худших
Конечно можно. Никогда не успользуй $user = User::all();
$userAllBalance = User::querty()->sum("balance");
И по поводу
$orders = Order::where('status', 0)->get();
$ordersWin = Order::where('status', 2)->get();

Погугли про CASE SQL, можно будет одним запросом получить всё это
Ответ написан
Комментировать
@RusMits
На самом деле ничего можно не переделывать.
Пока у вас страница грузится с таким кодом.
$user = User::all();
$tasks = Task::where('status', 1)->get();
$orders = Order::where('status', 0)->get();
$ordersWin = Order::where('status', 2)->get();
$ordersAllWin = Order::where('status', 2)->get();


Но если вы так будете писать код на каждой странице, то вам уже сейчас нужно разбираться, как писать более оптимальный код, и к чему приводит такой код. Лучшее решение для вас, это локально загрузить в каждую таблицу по по тысяче или 10 тысяч записей, можно больше, не знаю какой у вас объем, сервер, и тестировать загрузку страницы, через дебагер можешь видеть что будет отнимать время и оперативную память, далее этот участок кода оптимизируешь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы