Aller au contenu principal

← Utilisation des paramètres · Retour au README · Configuration →

Chargement anticipé

Charger les paramètres avec les modèles​

Sans chargement anticipé, chaque appel à settings()->get(), settings()->has() ou settings()->all() exécute une requête de paramètres. Ces lectures par le service ne chargent pas modelSettings comme effet de bord.

Chargez la relation à l’avance lorsque le résultat contient plusieurs modèles :

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

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

La relation chargée à l’avance contient les surcharges de chaque modèle et toutes les valeurs par défaut dont il hérite. Les appels suivants à get(), has() et all() utilisent la relation chargée.

Charger les paramètres après la requête​

Utilisez loadMissing() lorsque les modèles sont déjà disponibles :

$users->loadMissing('modelSettings');

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

Limites de la relation​

Utilisez modelSettings uniquement avec with(), load() ou loadMissing(), et comme propriété de la relation chargée. Il s’agit d’une optimisation de lecture, pas d’une API alternative de requête ou de CRUD. Lisez et modifiez les valeurs avec settings() ou defaultSettings().

Comportement des requêtes​

Lorsque les modèles parents sont récupérés puis que leurs paramètres sont lus, le chargement différé et le chargement anticipé ont le même coût pour un modèle. Pour une collection, la différence est visible :

Modèles parents chargésChargement différéChargement anticipé
12 requêtes2 requêtes
N1 + N requêtes2 requêtes

Le chargement anticipé utilise :

  1. Une requête pour les modèles parents.
  2. Une requête pour leurs valeurs par défaut et leurs surcharges.

La requête de paramètres inclut les valeurs par défaut de la classe et tous les identifiants de modèles demandés. La relation copie ensuite les valeurs par défaut héritées dans le résultat chargé de chaque modèle et remplace les clés correspondantes par les surcharges de ce modèle.

Ce comportement est couvert pour les clés primaires entières, chaînes, UUID et ULID.

Modifications après le chargement anticipé​

Après un appel réussi à set(), setMany(), forget(), forgetMany() ou purge(), le paquet efface exactement une fois la relation modelSettings chargée sur le modèle concerné. La lecture suivante par le service interroge la valeur effective actuelle et ne renvoie donc pas de données périmées. Une modification groupée en échec conserve la relation chargée existante et annule le lot transactionnel.

Chargez de nouveau la relation explicitement avant une autre lecture groupée :

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

$user->load('modelSettings');

La modification effectue toujours ses propres requêtes d’écriture. Le chargement anticipé ne change que les lectures suivantes.

Voir aussi​