Перейти до основного вмісту

← Робота з налаштуваннями · Повернутися до 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');

Зміна все одно виконує власні запити на запис. Попереднє завантаження впливає лише на подальші читання.

Див. також​