Как оптимизировать этот запрос к базе данных в Laravel? - PullRequest
0 голосов
/ 07 мая 2020

подскажите пожалуйста как можно улучшить запрос к базе данных в Laravel?

в репозитории два метода

    public function getCountAdverts(): array
    {
        return [
            Advert::STATUS_PUBLISHED => $this->getCount(Advert::STATUS_PUBLISHED),
            Advert::STATUS_CLOSED => $this->getCount(Advert::STATUS_CLOSED),
            Advert::STATUS_NOT_PUBLISHED => $this->getCount(Advert::STATUS_NOT_PUBLISHED),
            Advert::STATUS_MODERATION => $this->getCount(Advert::STATUS_MODERATION),
        ];
    }

    private function getCount(string $status): int
    {
        return Advert::where('status', $status)->count();
    }

Как я могу получить тот же массив, не выполняя всего 4 запроса?

enter image description here

enter image description here

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Вы можете использовать эту коллекцию возврата Eloquent. Так что работайте с коллекцией.

public function getCountAdverts(): array
{
    $adverts = Advert::get(); //this will be collection of all Adverts(Illuminate\Support\Collection)

    return [
        Advert::STATUS_PUBLISHED => $this->getCount($adverts, Advert::STATUS_PUBLISHED),
        Advert::STATUS_CLOSED => $this->getCount($adverts, Advert::STATUS_CLOSED),
        Advert::STATUS_NOT_PUBLISHED => $this->getCount($adverts, Advert::STATUS_NOT_PUBLISHED),
        Advert::STATUS_MODERATION => $this->getCount($adverts, Advert::STATUS_MODERATION),
    ];
}

private function getCount($adverts, string $status): int
{
    return $adverts->where('status', $status)->count();
}
1 голос
/ 07 мая 2020

Вместо выполнения нескольких запросов вы можете делать все в одном запросе

Advert::whereIn('status'[
    Advert::STATUS_PUBLISHED,
    Advert::STATUS_CLOSED,
    Advert::STATUS_NOT_PUBLISHED,
    Advert::STATUS_MODERATION
])
->groupBy('status')
->select(DB::raw('count(*)'), 'status')
->get()
->toArray();

Вы можете удалить условие whereIn, и вы получите счетчик для всех типов статусов.

Некоторые предложения:

  1. Вы можете индексировать столбец статуса
  2. Если статусы имеют префиксы, вы можете использовать Enum в базе данных, только если они не будут изменены в будущем.

Надеюсь, это поможет !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...