Tajuk yang ditulis semula ialah: Apakah yang menyebabkan "gelung tak terhingga berkemungkinan" apabila mengakses atribut model lain dalam atribut model yang dilampirkan?
P粉786432579
2023-09-04 17:47:10
<p>Aplikasi <strong>Laravel 9</strong> saya mempunyai dua model: model <kod>jenama</kod> Setiap <kod>produk</kod> milik satu <kod>jenama</kod> dan satu <kod>jenama</kod> kepunyaan berbilang <kod> perhubungan). Model <kod>produk</kod> hendaklah menyediakan sifat "dikira" (tambahan) yang dipanggil <kod>title_medium</kod> yang menggabungkan tajuk jenama dan tajuk produk atas permintaan. </p>
<p>Sebaik sahaja saya cuba mengakses <code>$this->brand</code> dalam <code>getTitleMediumAttribute()</code> kaedah <code>xdebug< Pengecualian <kod>possibleInfiniteloop</code> akan dilemparkan dan pelaksanaan akan dibatalkan (selepas N lelaran). Saya rasa ini ada kaitan dengan perhubungan dan urutan pemuatan (pemuatan bersemangat) tetapi saya tidak dapat mencari penyelesaian setakat ini. </p>
<h2>Model Jenama</h2>
Model <p><kod>jenama</kod> mempunyai atribut <kod>tajuk</kod> kod>. </p>
<pre class="brush:php;toolbar:false;">namespace AppModels;
gunakan IlluminateDatabaseEloquentFactoriesHasFactory;
gunakan IlluminateDatabaseEloquentModel;
gunakan IlluminateDatabaseEloquentRelationsHasMany;
gunakan IlluminateSupportStr;
kelas Jenama memanjangkan Model
{
gunakan HasFactory;
/*** Atribut tambahan untuk model ini*/
dilindungi $appends = [
'harga'
];
dilindungi $fillable = [
'tajuk'
];
/*** Yang "boot" kaedah model.
*
* @pemulangan batal*/
fungsi statik dilindungi boot()
{
static::creating(function ($brand) {
$brand->slug = Str::slug($brand->title, '-', 'de');
});
}
/*** Mengembalikan semua produk untuk jenama
*
* @kembali HasMany*/
produk fungsi awam(): HasMany
{
pulangkan $this->hasMany(Product::class);
}
}</pre>
<h2>Nombor model produk</h2>
<p>Setiap <kod>produk</kod> kepunyaan <kod>jenama</kod>. Atribut tambahan <code>title_medium</code> hendaklah menggabungkan tajuk jenama dan tajuk produk.</p>
<pre class="brush:php;toolbar:false;">namespace AppModels;
kelas Produk memanjangkan Model
{
gunakan HasFactory, Searchable, Filterable;
dilindungi $fillable = [
'tajuk',
'brand_id',
'gambar'
];
/*** Atribut tambahan untuk model ini*/
dilindungi $appends = [
'title_long',
'harga terendah',
'harga_percent_discount_tertinggi',
'tarikh_harga_terkini',
'kiraan_harga'
];
/*** Yang "boot" kaedah model.
*
* @pemulangan batal*/
fungsi statik dilindungi boot()
{
static::creating(function ($product) {
$product->slug = Str::slug($product->title_long, '-', 'de');
});
}
/*** Produk milik satu jenama*/
jenama fungsi awam(): BelongsTo
{
pulangkan $this->belongsTo(Brand::class);
}
/*** Dapatkan tajuk gabungan daripada produk dan jenama*/
fungsi awam getTitleMediumAttribute(): rentetan
{
// INI MENYEBABKAN "KEMUNGKINAN PENGECUALIAN LOOP TAK TERHINGGA" dalam xdebug
kembalikan $this->brand->title . '' . $ini->tajuk;
}
}</pre></p>
Cuba gunakan attribute dan bukannya getTitleMediumAttribute, seperti ini dan beritahu saya jika anda masih mendapat ralat yang sama (gunakan kaedah ini dan bukannya `getTitleMediumAttribute):
AttributeIlluminateDatabaseEloquentCastsAttribute
🎜属性
是IlluminateDatabaseEloquentCastsAttribute
ialah