← Работа с настройками · Вернуться к 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().
Поведение запросов
Если получить родительские модели, а затем прочитать их настройки, для одной модели ленивая и предварительная загрузка стоят одинаково. Для коллекции разница заметна:
| Загружено родительских моделей | Ленивая загрузка | Предварительная загрузка |
|---|---|---|
| 1 | 2 запроса | 2 запроса |
| N | 1 + N запросов | 2 запроса |
При предварительной загрузке выполняются:
- Один запрос родительских моделей.
- Один запрос их значений по умолчанию и переопределений.
Запрос настроек включает значения класса по умолчанию и идентификаторы всех запрошенных моделей. Затем связь копирует наследуемые значения по умолчанию в загруженный результат каждой модели и заменяет совпадающие ключи переопределениями этой модели.
Такое поведение покрыто для целочисленных, строковых, UUID- и ULID-первичных ключей.
Изменения после предварительной загрузки
После успешного вызова set(), setMany(), forget(), forgetMany() или purge() пакет ровно один
раз очищает загруженную связь modelSettings у соответствующей модели. Следующее чтение через сервис
запрашивает актуальное итоговое значение и не возвращает устаревшие данные. При ошибке группового
изменения существующая загруженная связь сохраняется, а транзакционный пакет откатывается.
Перед следующим пакетным чтением явно загрузите связь ещё раз:
$user->settings()->setMany([
'timezone' => 'Europe/Paris',
'locale' => 'fr',
]);
$user->load('modelSettings');
Изменение всё равно выполняет собственные запросы на запись. Предварительная загрузка влияет только на последующие чтения.
См. также
- Работа с настройками — объединение значений по умолчанию и переопределений.
- Справочник API — различия между методами сервиса и связью.
- Конфигурация — настройка подключения и модели хранения.