Перейти к основному содержимому

← Работа с настройками · Вернуться к README · Конфигурация →

Предварительная загрузка

Загрузка настроек вместе с моделями​

Без предварительной загрузки каждый вызов settings()->get(), settings()->has() или settings()->all() выполняет запрос настроек. Эти чтения через сервис не загружают modelSettings как побочный эффект.

Загружайте связь заранее, если результат содержит несколько моделей:

$users = User::query()
->with('modelSettings')
->get();

$timezones = $users->map(
fn (User $user) => $user->settings()->get('timezone')
);

Предварительно загруженная связь содержит переопределения каждой модели и все наследуемые значения по умолчанию. Следующие вызовы get(), has() и all() используют загруженную связь.

Загрузка настроек после запроса​

Если модели уже получены, используйте loadMissing():

$users->loadMissing('modelSettings');

$settings = $users->map(
fn (User $user) => $user->settings()->all()
);

Граница связи​

Используйте modelSettings только с with(), load() или loadMissing() и как свойство с уже загруженной связью. Это оптимизация чтения, а не альтернативный API запросов или CRUD. Читайте и изменяйте значения через settings() или defaultSettings().

Поведение запросов​

Если получить родительские модели, а затем прочитать их настройки, для одной модели ленивая и предварительная загрузка стоят одинаково. Для коллекции разница заметна:

Загружено родительских моделейЛенивая загрузкаПредварительная загрузка
12 запроса2 запроса
N1 + N запросов2 запроса

При предварительной загрузке выполняются:

  1. Один запрос родительских моделей.
  2. Один запрос их значений по умолчанию и переопределений.

Запрос настроек включает значения класса по умолчанию и идентификаторы всех запрошенных моделей. Затем связь копирует наследуемые значения по умолчанию в загруженный результат каждой модели и заменяет совпадающие ключи переопределениями этой модели.

Такое поведение покрыто для целочисленных, строковых, UUID- и ULID-первичных ключей.

Изменения после предварительной загрузки​

После успешного вызова set(), setMany(), forget(), forgetMany() или purge() пакет ровно один раз очищает загруженную связь modelSettings у соответствующей модели. Следующее чтение через сервис запрашивает актуальное итоговое значение и не возвращает устаревшие данные. При ошибке группового изменения существующая загруженная связь сохраняется, а транзакционный пакет откатывается.

Перед следующим пакетным чтением явно загрузите связь ещё раз:

$user->settings()->setMany([
'timezone' => 'Europe/Paris',
'locale' => 'fr',
]);

$user->load('modelSettings');

Изменение всё равно выполняет собственные запросы на запись. Предварительная загрузка влияет только на последующие чтения.

См. также​