@drnkwtr
forblitz.ru dev

Как оптимизировать получение трёх выборок из одной таблицы?

Доброго времени суток! Задача следующая: имеется одна таблица files, в которой содержатся данные о различных файлах и один из параметров - type [archive/image/thumbnail] и их требуется вывести в Api в таком формате:
63234f3b8c27c124507183.jpeg
Однако, при моём способе реализации, выходит 3 запроса к одной базе данных с тремя разными выборками. Вопрос: возможно ли объединить их в один и имеет ли такая "оптимизация" вообще место быть?
63234fd31c37f741056753.png
Моя реализация следующая:
ModResource
public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'slug' => $this->slug,
            'author' => new AuthorResource($this->mod_author),
            'sticky' => $this->sticky,
            'categories' => CategoryResource::collection($this->categories),
            'files' => [
                'archives' => FileResource::collection($this->mod_archives),
                'images' => FileResource::collection($this->mod_images),
                'thumbnail' => FileResource::collection($this->mod_thumbnail)
            ]
        ];
    }

Mod (model)
public function files() {
        return $this->hasMany(File::class);
    }

    public function mod_archives() {
        return $this->files()->where('type', 'archive');
    }

    public function mod_images() {
        return $this->files()->where('type', 'image');
    }

    public function mod_thumbnail() {
        return $this->files()->where('type', 'thumbnail');
    }

ModController
public function index()
    {
        $mods = Mod::with('categories')
            ->with('mod_author')
            ->with('mod_archives')
            ->with('mod_thumbnail')
            ->with('mod_images')
            ->paginate('10');

        return ModResource::collection($mods);
    }
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Если у вас только 3 типа файла, и по факту вы выдергиваете все файлы, вы можете выдернуть только файлы и фильтровать на уровне коллекций.

public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'slug' => $this->slug,
            'author' => new AuthorResource($this->mod_author),
            'sticky' => $this->sticky,
            'categories' => CategoryResource::collection($this->categories),
            'files' => [
                'archives' => FileResource::collection($this->files->where('type', '=', 'archive')),
                'images' => FileResource::collection($this->files->where('type', '=', 'images')),
                'thumbnail' => FileResource::collection($this->files->where('type', '=', 'thumbnail'))
            ]
        ];
    }

Будет ли это иметь смысл. Да хз - надо смотреть на контекст. Лишний раз дергать базу - не сказать что бы хорошо, лопатить миллионы записей в массивах тоже занятие такое себе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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