【问题标题】:Why is my Laravel Eloquent accessor not showing up in the response?为什么我的 Laravel Eloquent 访问器没有出现在响应中?
【发布时间】:2017-12-18 16:08:42
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 要自动将访问者附加到响应中,您可以使用github.com/topclaudy/eloquent-auto-append
    • 非常感谢!我花了很多时间在 vue 组件中使用访问器!
    • 这是否适用于特征中的方法?因为我将 isAdmin() 移到了一个 trait
    【解决方案2】:

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

    $model->getReviewDateIsoAttribute()
    

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

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

    protected $appends = ['name_of_attribute'];
    

    【讨论】:

    • 我明白你想说什么,但是 Laravel accessors 是动态创建属性的“神奇”函数,因此这仍然应该有效。请查看文档的getFullNameAttribute 示例。
    • 它也可能与您的查询结构方式有关,这里有一个指向类似laracasts.com/discuss/channels/laravel/…的问题的链接
    【解决方案3】:

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

    我以为我错过了什么。后来我注意到,当我们 dd 查询结果时,附加的属性是单独显示的,而不是通常的属性 JSON。

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

    【讨论】:

      【解决方案4】:

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

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

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

      protected $appends = ['review_date_iso'];
      

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

      【讨论】:

        猜你喜欢
        • 2022-08-20
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 2015-02-09
        • 2022-12-05
        • 2011-03-01
        • 2020-03-07
        • 1970-01-01
        相关资源
        最近更新 更多