← Робота з налаштуваннями · Повернутися до 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 — відмінності між методами сервісу та зв’язком.
- Конфігурація — налаштування підключення й моделі зберігання.