重写后的标题为:What causes a "possible infinite loop" when accessing another model attribute in an appended attribute of a model?
<p>我的 <strong>Laravel 9</strong> 应用程序有两个模型: <code>brand</code> 模型和 <code>product</code> 模型。每个 <code>product</code> 属于一个 <code>brand</code>,而一个 <code>brand</code> 又属于多个 <code>products</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> 的 <code>products</code>。</p>
<pre class="brush:php;toolbar:false;">namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Str;
class Brand extends Model
{
use HasFactory;
/*** 该模型的附加属性*/
protected $appends = [
'prices'
];
protected $fillable = [
'title'
];
/***“启动”模型的方法。
*
* @返回无效*/
protected static function booted()
{
static::creating(function ($brand) {
$brand->slug = Str::slug($brand->title, '-', 'de');
});
}
/*** 返回某个品牌的所有产品
*
* @return 有很多*/
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}</pre>
<h2>产品型号</h2>
<p>每个<code>产品</code>都属于一个<code>品牌</code>。附加属性 <code>title_medium</code> 应连接品牌标题和产品标题。</p>
命名空间 App\Models;
产品类扩展模型
{
使用 HasFactory、可搜索、可过滤;
受保护的$可填充= [
'标题',
'品牌 ID',
'图像'
];
/*** 该模型的附加属性*/
受保护的 $appends = [
'标题_长',
'最低价格',
'最高折扣百分比价格',
'最新价格日期',
'价格计数'
];
/***“启动”模型的方法。
*
* @返回无效*/
受保护的静态函数 booted()
{
静态::创建(函数($产品){
$product->slug = Str::slug($product->title_long, '-', 'de');
});
}
/*** 产品属于一个品牌*/
公共功能品牌():BelongsTo
{
返回 $this->belongsTo(Brand::class);
}
/*** 获取产品和品牌的组合标题*/
公共函数 getTitleMediumAttribute(): 字符串
{
// 这会导致“可能的无限循环异常”在 xdebug 中
返回 $this->brand->title 。 ''。 $这个->标题;
}
}</pre></p>