Laravel - 从关系的属性中获取值作为当前模型的属性

Laravel - getting a value from a relationship's attributes as an attribute of the current model

我有 2 个模型:Car 和 Condition

Car 和 Condition 具有一对一的多态关系。条件加入到汽车上:

class Car extends Model 
{
    // ...

    public function condition()
    {
        return $this->morphOne(Condition::class, 'carable');
    }
}

class Condition extends Model
{
    // ...

    public function carable()
    {
        return $this->morphTo()
    }
}

这个return结构如下:

{ // car
    "id": 1,
    "condition": {
        "age": "1 year",
        "serviced": "yes"
    }
}

我还想 return 汽车等级的 age 属性,即

{ // car
    "id": 1,
    "age": "1 year",
    "condition": {
        "age": "1 year",
        "serviced": "yes"
    }
}

我想通过获取汽车模型中的条件->年龄属性来完成此操作。我尝试在 Car class:

中设置以下内容
protected $appends = ["age"];
protected function getAgeAttribute()
{
    return $this->getFinancialAttribute()->getAgeAttribute();
}

以及它的一些其他变体,但没有成功。有什么办法让我优雅地做到这一点?

您可以尝试将此代码添加到您的 Car 模型中:

protected $appends = ['age'];
protected function getAgeAttribute()
{
    return $this->condition->age;
}

但一定要 eager load condition 与您的 Car 模型一起避免 N + 1 查询问题。

$cars = Car::with('condition')->get();

在您的情况下,您可以默认加载 将此行添加到您的 Car 模型:

protected $with = ['condition'];

顺便说一句,您在 Car 模型上的关系应该是这样的:

public function condition()
{
    return $this->morphOne(Condition::class, 'carable');
}