Le titre réécrit est : Qu'est-ce qui provoque une « boucle infinie possible » lors de l'accès à un autre attribut de modèle dans un attribut ajouté d'un modèle ?
<p>Mon application <strong>Laravel 9</strong> comporte deux modèles : le modèle <code>brand</code> Chaque <code>produit</code> appartient à un <code>marque</code>, et un <code>marque</code> relation). Le modèle <code>product</code> doit fournir une propriété "calculée" (supplémentaire) appelée <code>title_medium</code> qui concatène le titre de la marque et le titre du produit sur demande. </p>
<p>Une fois que j'ai essayé d'accéder à <code>$this->brand</code> dans la méthode <code>getTitleMediumAttribute()</code> L'exception <code>possibleInfiniteloop</code> sera levée et l'exécution sera annulée (après N itérations). Je pense que cela a quelque chose à voir avec les relations et les séquences de chargement (chargement hâtif) mais jusqu'à présent, je n'ai pas trouvé de solution. </p>
<h2>Modèle de marque</h2>
Le modèle <p><code>brand</code> possède un attribut <code>title</code> code>. </p>
<pre class="brush:php;toolbar:false;">espace de noms AppModels;
utilisez IlluminateDatabaseEloquentFactoriesHasFactory ;
utilisez IlluminateDatabaseEloquentModel ;
utilisez IlluminateDatabaseEloquentRelationsHasMany ;
utilisez IlluminateSupportStr ;
la marque de classe étend le modèle
{
utilisez HasFactory ;
/*** Attributs supplémentaires pour ce modèle*/
protégé $appends = [
'des prix'
];
protégé $remplissable = [
'titre'
];
/*** Le module "démarré" méthode du modèle.
*
* @retour nul*/
fonction statique protégée démarrée()
{
static :: création (fonction ($ marque) {
$brand->slug = Str::slug($brand->title, '-', 'de');
});
}
/*** Renvoie tous les produits d'une marque
*
* @return HasMany*/
produits de fonction publique (): HasMany
{
return $this->hasMany(Product::class);
}
}</pré>
<h2>Numéro de modèle du produit</h2>
<p>Chaque <code>produit</code> appartient à un <code>marque</code>. L'attribut supplémentaire <code>title_medium</code> doit concaténer le titre de la marque et le titre du produit.</p>
<pre class="brush:php;toolbar:false;">espace de noms AppModels;
classe Le produit étend le modèle
{
utilisez HasFactory, consultable, filtrable ;
protégé $remplissable = [
'titre',
'identifiant_marque',
'image'
];
/*** Attributs supplémentaires pour ce modèle*/
protégé $appends = [
'titre_long',
'prix le plus bas',
'highest_discount_percent_price',
'dernier_prix_date',
'prix_count'
];
/*** Le module "démarré" méthode du modèle.
*
* @retour nul*/
fonction statique protégée démarrée()
{
static :: création (fonction ($ produit) {
$product->slug = Str::slug($product->title_long, '-', 'de');
});
}
/*** Le produit appartient à une seule marque*/
marque de fonction publique() : BelongsTo
{
return $this->belongsTo(Brand::class);
}
/*** Obtenez le titre combiné du produit et de la marque*/
fonction publique getTitleMediumAttribute() : chaîne
{
// CELA PROVOQUE UNE "EXCEPTION POSSIBLE DE BOUCLE INFINIE" dans xdebug
renvoie $this->brand->title . '' . $this->titre;
}
}</pre></p>