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
364

Mon application Laravel 9 comporte deux modèles : le modèle brand Chaque produit appartient à un marque, et un marque relation). Le modèle product doit fournir une propriété "calculée" (supplémentaire) appelée title_medium qui concatène le titre de la marque et le titre du produit sur demande.

Une fois que j'ai essayé d'accéder à $this->brand dans la méthode getTitleMediumAttribute() L'exception possibleInfiniteloop 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.

Modèle de marque

Le modèle

brand possède un attribut title code>.

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); } } 

Numéro de modèle du produit

Chaque produit appartient à un marque. L'attribut supplémentaire title_medium doit concaténer le titre de la marque et le titre du produit.

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; } }

P粉786432579
P粉786432579

répondre à tous (1)
P粉306523969

Essayez d'utiliserattributeau 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属性IlluminateDatabaseEloquentCastsAttributeestIlluminateDatabaseEloquentCastsAttribute

    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!