Стремительная загрузка (withCount), ограничение на сколько моделей вы можете предварительно загрузить? - PullRequest
0 голосов
/ 29 февраля 2020

У меня проблема с отображением клиентской части таблицы, но возвращаемое количество строк составляет около 2,5 тыс. Записей. Модель имеет отношение «многие ко многим» с моделью предложения через таблицу мостов / сводок с примерно 7k строк:

    public function sentences()
    {
        return $this->belongsToMany(Sentence::class)->withTimestamps();
    }

Я пытаюсь предварительно загрузить предложения с помощью $entries = Entry:::with('sentences')->get();, но это генерирует запрос с 2,5 тыс. идентификаторов в нем where entry_sentence.entry_id in (1, 2, 3, 4, 5, 7, ..., 2462, 2463, 2464).

Этот сгенерированный запрос выполняется примерно за 0,06 с на моей локальной машине. Но создание коллекции занимает около 8 секунд, что, по-моему, связано с увлажнением? Без предварительной загрузки это очень быстро, но затем я сталкиваюсь с n + 1 проблемами, зацикливающимися на моих строках.

Я вынужден либо выполнять «сырые» запросы DB :: table () без Eloquent или нумерации страниц (и таким образом, фильтрация на стороне сервера и т. д.)? Каков разумный предел для загруженных отношений? Кажется, я нигде не могу найти совета по этому вопросу. Я использую Datatables во внешнем интерфейсе, и их эмпирическое правило делало AJAX до примерно 5 тыс. Строк, тогда вы должны рассмотреть вместо этого разбиение на страницы на стороне сервера.

1 Ответ

0 голосов
/ 29 февраля 2020

Вы можете настроить соответствующий запрос:

$entries = Entry:::with('sentences' => function($query) {
    return $query->limit(5); // however many is useful
}])->get();
...