搜索

首页  >  问答  >  正文

重写后的标题为: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>
P粉786432579P粉786432579454 天前457

全部回复(1)我来回复

  • P粉306523969

    P粉3065239692023-09-05 15:17:18

    尝试使用 属性 而不是 < code>getTitleMediumAttribute,像这样并告诉我是否仍然遇到相同的错误(使用此方法而不是 `getTitleMediumAttribute):

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

    属性\Illuminate\Database\Eloquent\Casts\Attribute

    回复
    0
  • 取消回复