書き直されたタイトルは次のとおりです。モデルの追加された属性内の別のモデル属性にアクセスするときに「無限ループの可能性」が発生する原因は何ですか?
<p>私の <strong>Laravel 9</strong> アプリケーションには、<code>brand</code> モデルと <code>product</code> モデルの 2 つのモデルがあります。各 <code>product</code> は 1 つの <code>brand</code> に属し、1 つの <code>brand</code> は複数の <code>product</code> に属します (1:n関係)。 <code>product</code> モデルは、リクエストに応じてブランド タイトルと製品タイトルを連結する <code>title_medium</code> と呼ばれる「計算された」(追加の) プロパティを提供する必要があります。 </p>
<p>製品モデルの <code>getTitleMediumAttribute()</code> メソッドで <code>$this->brand</code> にアクセスしようとすると、<code>xdebug</code> <code>possibleInfiniteloop</code> 例外がスローされ、実行はキャンセルされます (N 回の反復後)。これは関係とロードシーケンス(熱心なロード)に関係があると思いますが、今のところ解決策が見つかりません。 </p>
<h2>ブランドモデル</h2>
<p><code>brand</code> モデルには属性 <code>title</code> があり、<code>brand</ に属する多数の <code>product</code> があります。コード>。 </p>
<pre class="brush:php;toolbar:false;">名前空間 App\Models;
Illuminate\Database\Eloquent\Factories\HasFactory を使用します。
Illuminate\Database\Eloquent\Model を使用します。
Illuminate\Database\Eloquent\Relations\HasMany を使用します。
Illuminate\Support\Str を使用します。
クラスブランドはモデルを拡張します
{
HasFactoryを使用します。
/*** このモデルの追加属性*/
保護された $appends = [
「価格」
];
protected $fillable = [
'タイトル'
];
/*** 「ブート済み」モデルのメソッド。
*
* @return void*/
保護された静的関数 booted()
{
static::creating(function ($brand) {
$brand->slug = Str::slug($brand->title, '-', 'de');
});
}
/*** あるブランドのすべての商品を返品します
*
* @return HasMany*/
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}</pre>
<h2>製品型番</h2>
<p>各<code>製品</code>は<code>ブランド</code>に属します。追加属性 <code>title_medium</code> は、ブランド タイトルと製品タイトルを連結する必要があります。</p>
<pre class="brush:php;toolbar:false;">名前空間 App\Models;
クラス Product はモデルを拡張します
{
HasFactory、Searchable、Filterable を使用します。
protected $fillable = [
'タイトル'、
'ブランドID',
'画像'
];
/*** このモデルの追加属性*/
保護された $appends = [
'title_long',
'最低価格'、
'最高割引率',
'最新の価格の日付',
'価格_数'
];
/*** 「ブート済み」モデルのメソッド。
*
* @return void*/
保護された静的関数 booted()
{
static::creating(function ($product) {
$product->slug = Str::slug($product->title_long, '-', 'de');
});
}
/**※商品は一つのブランドに属します*/
パブリック関数 brand(): BelongsTo
{
return $this->belongsTo(Brand::class);
}
/*** 製品とブランドから結合されたタイトルを取得します*/
パブリック関数 getTitleMediumAttribute(): 文字列
{
// これにより、「無限ループの例外が発生する可能性があります」が発生します。 xdebugで
$this->brand->title を返します。 「 」。 $this->タイトル;
}
}</pre></p>