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粉786432579
P粉786432579 2023-09-04 17:47:10
0
1
393
<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>
P粉786432579
P粉786432579

répondre à tous(1)
P粉306523969

Essayez d'utiliser attribute au lieu de getTitleMediumAttribute, aimez ceci et dites-moi si vous obtenez toujours la même erreur (utilisez cette méthode au lieu de `getTitleMediumAttribute) :

public function titleMedium(): Attribute
{
    return Attribute::get(
        fn () => "{$this->brand->title} $this->title",
    );
}

Attribute属性IlluminateDatabaseEloquentCastsAttribute est IlluminateDatabaseEloquentCastsAttribute

🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!