在模型中附加 属性 内部急切加载

Eager loading inside appending property in model

我想将 category_id 追加到 seat 集合中,但我需要使用预先加载或关系来填充它。

我哪里做错了?

座椅型号:

class Seat extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    public $appends = ['category_id'];

    protected $fillable = [
        'seat_name',
        'seat_url',
        'logo_src',
    ];

    public function getCategoryIdAttribute()
    {
        return $this->hasMany(AdSeatCategories::class);
    }

}

当我 运行 Seat::all(); 时,我得到 {}category_id 作为回应。 响应示例:

{
"id": 95,
"seat_name": "gtest",
"seat_url": "http://ooop.com",
"logo_src": null,
"category_id": {},
},

看起来你的 getCategoryIdAttribute() 是 return 关系,当你想要它到 return 集合时,请务必这样调用 get()

public function getCategoryIdAttribute()
{
    return $this->hasMany(AdSeatCategories::class)->get();
}

或者,也许您想要一个关系和一个属性:

public function categories()
{
    return $this->hasMany(AdSeatCategories::class);
}

public function getCategoryIdsAttribute()
{
    return $this->categories()->get()->pluck('id');
}

您应该将关系与预先加载的属性分开。

class Seat extends Model
{
   public $appends = ['category_id'];

   /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
    protected $fillable = [
        'seat_name',
        'seat_url',
        'logo_src',
    ];

    public function getCategoryIdAttribute()
    {
        return $this->categories()->pluck('id');
    }

    public function categories()
    {
        return $this->hasMany(AdSeatCategories::class);
    }

}

使用关系 categories 的更好解决方案是调用模型 Seat

class Seat extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    protected $fillable = [
        'seat_name',
        'seat_url',
        'logo_src',
    ];

    public function categories()
    {
        return $this->hasMany(AdSeatCategories::class);
    }

}

在控制器中执行:

$seats = Seat::with('categories:id')->get();