Laravel - 当以JSON格式返回集合时,accessor无法工作。

5

我正在使用Laravel为VueJS前端SPA构建API。

我需要接受和返回日期格式为'd-m-Y',而不是存储在数据库中的'Y-m-d'格式。 数据变换器正常工作,并且我成功地使用给定的日期保存了它, 但当我运行以下命令时:

$active = Announcement::where('group_id', $this->user->group_id)->where('dateTo', '>=', Carbon::today())->get();
        return response()->json($active);

我得到了纯粹的数据库数据,而不是格式化后的数据。 例如,我有一个需要格式化的dateTo字段:

 public function getDateToAttribute($value)
    {
        $date = Carbon::createFromFormat('Y-m-d', $value);
        return $date->format('d-m-Y');
    }

我该怎么做?

3个回答

13

正如 @Jared 所说,访问器/修改器只有在应用程序调用时才存在。因此,在以JSON返回的集合中,不存在访问器/修改器。

编写循环来调用所有所需的访问器/修改器太麻烦了,但 Laravel 提供了内置解决方案。

在您的模型 Announcement.php 中,您只需要指定将始终附加在请求上的访问器/修改器即可。

protected $appends = array('dateTo');

使用这个解决方案,每个请求都将包含一个 dateTo 参数,格式可以按照您的喜好进行。

问候!

PS: 您可以根据您的请求更改 $appends 数组,因此所有返回 JSON 的请求都将发送 dateTo 参数,但其他请求则不会。


太棒了 ;) 这解决了在JSON中进行急加载而不需要循环的问题。 - AbdulBasit

0

Laravel 在将模型转换为数组或 JSON 时会运行访问器。

因此,我建议您更新您的代码:

$active = Announcement::where('group_id', $this->user->group_id)->where('dateTo', '>=', Carbon::today())->get();

return response()->json($active->toArray());

它不工作...仍然不能访问... 它应该在不使用->toArray的情况下执行此操作,因为它正在转换为JSON... - Marek Urbanowicz
是的,那是真的。 仔细看一下,你的日期字段是dateTo而不是date_to。只有当你的字段名称与它期望的格式匹配时,即date_to时,Laravel才会执行自动访问器。 - Jared Rolt

0

试一下

    $active = Announcement::where('group_id', $this->user->group_id)->where('dateTo', '>=', Carbon::today())->get();
    foreach($active as $activeRecords){
       print_r($activeRecords->dateTo);
    }

属性

public function getDateToAttribute($value)
{
    return Carbon::parse($value)->format('d-m-Y');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接