为什么我的 Laravel Eloquent 访问器没有出现在响应中?

Why is my Laravel Eloquent accessor not showing up in the response?

我有一个模型 Review,它有一个 unix 时间戳作为它的属性之一(table 列)。

我在这个模型中使用了 2 accessors:

public function getReviewDateAttribute($value)
{
    return strftime('%A %e %B %Y', $value);
}

public function getReviewDateIsoAttribute()
{
    return Carbon::createFromTimestamp($this->review_date)->toDateTimeString();
}

getReviewDateAttribute 按预期工作并在我编写查询时显示在模型集合中。

然而 getReviewDateIsoAttribute 没有。这可能是什么原因?

子问题:如果我在两个函数中使用相同的属性,如何使用原始格式作为输入值?

您应该将其添加到 $appends 数组中。它并没有遍历所有可用的方法来寻找 getXXXXXAttribute。使用另一个是因为它是实际属性的访问器,这个不是实际属性。

class YourModel ....
{
     protected $appends = ['review_date_iso'];
     ...
}

Laravel 5.5 Docs - Eloquent - Serialization - Appending Values to JSON

这可能是因为 ReviewDateIso 不是实际的列,因此不会出现在模型集合中...您可以通过直接调用方法直接访问它

$model->getReviewDateIsoAttribute()

根据文档访问器,一种在将列返回给查询它的方法之前更改列值的方法。

如果您希望它在调用集合时显示 Json 将其附加到输出

protected $appends = ['name_of_attribute'];

事实上,这取决于您要实现的目标。例如,如果您要在 Blade 中显示任何内容,您可以随时使用 $object->review_date_iso 来获取此属性值。

但是,如果您要返回 Json 响应(例如 API),您需要告诉 Eloquent 模型在转换为 [=26= 时向模型附加额外的字段]格式。

您的模型中可能有 review_date 属性(我想这是数据库中的列)但是您在数据库中的 table 中没有 review_date_iso,所以在您需要使用的模型:

protected $appends = ['review_date_iso'];

但您不必在此处包含 review_date,因为它已经在您的 table 数据库中,并且您的访问器将被自动触发。

我尝试在 tinker 中使用 dd 方法进行查询。所以我很困惑,因为我无法在属性列表中查看我的新访问器。

我以为我错过了什么。然后后来我注意到当我们 dd 查询结果时附加的属性与通常的属性 JSON.

分开显示

我以为我的访问器不工作而浪费了时间。只是我没有在正确的方式或正确的地方检查。所以我附上下面的图片,如果有人像我一样卡在访问器上,这可能会对他们有所帮助。