为什么我的Laravel Eloquent访问者没有出现在回复中?

时间:2017-12-18 16:08:42

标签: laravel laravel-5 eloquent laravel-5.5 accessor

我有一个模型Review,它的unix时间戳是其属性中的一个(表格列)。

我在这个模型中使用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没有。这可能是什么原因?

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

enter image description here

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:1)

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

$model->getReviewDateIsoAttribute()

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

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

protected $appends = ['name_of_attribute'];

答案 2 :(得分:0)

实际上,这取决于你想要实现的目标。例如,如果您要在Blade中显示任何内容,则只要您希望$object->review_date_iso获取此属性值,就可以使用。

但是,如果要返回Json响应(例如API),则需要告诉Eloquent模型在转换为JSON格式时将额外字段附加到模型中。

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

protected $appends = ['review_date_iso'];

但您不必在此处review_date,因为它已经在您的数据库表中,您的访问者将被自动解雇。

答案 3 :(得分:0)

我尝试使用修补程序和dd方法查询。因此,我无法在属性列表中查看新的访问器,因此感到困惑。

我以为我错过了一些东西。然后,后来我注意到,当我们对查询结果进行dd处理时,附加属性将与普通属性JSON分开显示。

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

enter image description here