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