Maison  >  Questions et réponses  >  le corps du texte

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>
P粉786432579P粉786432579432 Il y a quelques jours437

répondre à tous(1)je répondrai

  • P粉306523969

    P粉3065239692023-09-05 15:17:18

    Essayez d'utiliser attribute au lieu de < code>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

    🎜

    répondre
    0
  • Annulerrépondre