root09
@root09

Как заменить whereHas, ибо он слишком медленный?

Сейчас есть вот такой код, который выводит все статьи в нужной категории:
$articles = Article:with('types')->whereHas('categories', function ($query) use ($name) {
            $query->where('name', $name);
})->paginate(10);

Но записей в таблице много и он выполняется долго, нашел в гугле решение,использовать whereRaw (https://stackoverflow.com/a/36384966)
Но не могу переделать под себя, в том примере выборка происходит по id категории, а у меня она идет по имени, т.е нужно дополнительно достать id категории по её имени из таблицы categories, но как?
  • Вопрос задан
  • 303 просмотра
Решения вопроса 1
@Kostik_1993
Web Developer
Если подумать, то лучше два простых и быстрых запросов чем один тяжелый.
В любом случае я думаю категория/ии вам в шаблоне отдельно все равно где-то понадобятся, значит можно сначала получить ее/их по имени, а затем получить статьи

$categories = Category::whereName($name)->get();
$articles = Article:with('types')->whereIn('id', $categories->pluck('id'))->paginate(10);


Если же вы настаиваете на одном запросе, вам придется использовать Join-ы, что также плохо скажется на производительности
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
whereHas делает обычный exists. Он даже и близко не медленный. Проблема в отсутствии индексов (на categories.name и в колонках, связывающих две таблицы).
Ответ написан
Ваш ответ на вопрос

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

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