Tajuk yang ditulis semula ialah: Apakah yang menyebabkan "gelung tak terhingga berkemungkinan" apabila mengakses atribut model lain dalam atribut model yang dilampirkan?
P粉786432579
P粉786432579 2023-09-04 17:47:10
0
1
451
<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>
P粉786432579
P粉786432579

membalas semua(1)
P粉306523969

Cuba gunakan attribute dan bukannya getTitleMediumAttribute, seperti ini dan beritahu saya jika anda masih mendapat ralat yang sama (gunakan kaedah ini dan bukannya `getTitleMediumAttribute):

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

Attribute属性IlluminateDatabaseEloquentCastsAttribute ialah IlluminateDatabaseEloquentCastsAttribute

🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan