Der umgeschriebene Titel lautet: Was verursacht eine „mögliche Endlosschleife', wenn auf ein anderes Modellattribut in einem angehängten Attribut eines Modells zugegriffen wird?
P粉786432579
P粉786432579 2023-09-04 17:47:10
0
1
433
<p>Meine <strong>Laravel 9</strong>-Anwendung hat zwei Modelle: das <code>brand</code>-Modell. Jedes <code>Produkt</code> gehört zu einer <code>Marke</code> und ein <code>Marke</code> gehört zu mehreren <code>Produkten</code> Beziehung). Das Modell <code>product</code> sollte eine „berechnete“ (zusätzliche) Eigenschaft namens <code>title_medium</code> bereitstellen, die auf Anfrage den Markentitel und den Produkttitel verknüpft. </p> <p>Sobald ich versuche, auf <code>$this->brand</code> in der Methode <code>getTitleMediumAttribute()</code> Die <code>possibleInfiniteloop</code>-Ausnahme wird ausgelöst und die Ausführung wird abgebrochen (nach N Iterationen). Ich denke, das hat etwas mit Beziehungen und Ladesequenzen zu tun (eifriges Laden), aber bisher kann ich keine Lösung finden. </p> <h2>Markenmodell</h2> Das Modell <p><code>brand</code> verfügt über ein Attribut <code>title</code> Code>. </p> <pre class="brush:php;toolbar:false;">namespace AppModels; verwenden Sie IlluminateDatabaseEloquentFactoriesHasFactory; verwenden Sie IlluminateDatabaseEloquentModel; verwenden Sie IlluminateDatabaseEloquentRelationsHasMany; benutze IlluminateSupportStr; Klasse Marke erweitert Modell { benutze HasFactory; /*** Zusätzliche Attribute für dieses Modell*/ protected $appends = [ 'Preise' ]; protected $fillable = [ 'Titel' ]; /*** Die "gebootete" Methode des Modells. * * @return void*/ geschützte statische Funktion booted() { static::creating(function ($brand) { $brand->slug = Str::slug($brand->title, '-', 'de'); }); } /*** Gibt alle Produkte einer Marke zurück * * @return HasMany*/ öffentliche Funktion products(): HasMany { return $this->hasMany(Product::class); } }</pre> <h2>Produktmodellnummer</h2> <p>Jedes <code>Produkt</code> gehört zu einer <code>Marke</code>. Das zusätzliche Attribut <code>title_medium</code> sollte den Markentitel und den Produkttitel verketten.</p> <pre class="brush:php;toolbar:false;">namespace AppModels; Klasse Produkt erweitert Modell { Verwenden Sie HasFactory, Searchable, Filterable; protected $fillable = [ 'Titel', 'brand_id', 'Bild' ]; /*** Zusätzliche Attribute für dieses Modell*/ protected $appends = [ 'title_long', 'geringster Preis', 'highest_discount_percent_price', 'latest_price_date', 'price_count' ]; /*** Die "gebootete" Methode des Modells. * * @return void*/ geschützte statische Funktion booted() { static::creating(function ($product) { $product->slug = Str::slug($product->title_long, '-', 'de'); }); } /*** Produkt gehört zu einer Marke*/ öffentliche Funktion brand(): BelongsTo { return $this->belongsTo(Brand::class); } /*** Erhalten Sie den kombinierten Titel aus Produkt und Marke*/ öffentliche Funktion getTitleMediumAttribute(): string { // DIES FÜHRT ZU EINER „MÖGLICHEN UNENDLICHEN SCHLEIFENAUSNAHME“ im xdebug Geben Sie $this->brand->title zurück. ' ' . $this->title; } }</pre></p>
P粉786432579
P粉786432579

Antworte allen(1)
P粉306523969

尝试使用 属性 而不是 getTitleMediumAttribute,像这样并告诉我是否仍然遇到相同的错误(使用此方法而不是 `getTitleMediumAttribute):

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

属性\Illuminate\Database\Eloquent\Casts\Attribute

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!