Перайсці да асноўнага змесціва

← Праца з наладамі · Вярнуцца да 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');

Змяненне ўсё роўна выконвае ўласныя запыты на запіс. Папярэдняя загрузка ўплывае толькі на наступныя чытанні.

Гл. таксама​