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
2023-09-04 17:47:10
<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>
尝试使用 属性 而不是 getTitleMediumAttribute,像这样并告诉我是否仍然遇到相同的错误(使用此方法而不是 `getTitleMediumAttribute):
属性
是\Illuminate\Database\Eloquent\Casts\Attribute