带有json类型字段的Laravel数据库在返回值时添加“”

Posted

技术标签:

【中文标题】带有json类型字段的Laravel数据库在返回值时添加“”【英文标题】:Laravel database with json type field adds \" when returning value 【发布时间】:2016-03-10 11:25:08 【问题描述】:

我已经修改了 Laravel 5 文档,并且我看到它支持数据库中的 json 类型字段,但我注意到非常奇怪的行为。

这是我的桌子:

Schema::create('subjects', function ($table) 
        $table->increments('id');
        $table->string('name', 100);
        $table->integer('ects');

        $table->json('studies'); // this is my json type field

        $table->date('created_at');
        $table->date('updated_at');
);

然后我使用以下命令为数据库播种:

Subject::create(['name' => 'Programming 1', 
'ects' => '0',
'studies' => '"program":"Computer Science","year":"1"']);

服务器响应如下所示:


     "id": 15,
     "name": "Programming 1",
     "brEcts": 0,
     "studies": "\"program\":\"Computer Science\",\"year\":\"1\"",
     "created_at": "2015-12-05 00:00:00",
     "updated_at": "2015-12-05 00:00:00",
     "pivot": 
         "profesor_id": 20,
         "subject_id": 15
     

注意响应字段研究中的“\”,laravel为我生成的“pivot”字段结构正确,也是json类型的字段。

当我查看 phpMyAdmin 时,研究字段的值看起来很正常。 (不带 \")

我的响应服务器代码:

$subjects = Profesor::find($id)->subjets()->get();
return response()->json($subjects);

我是否正确地为数据库播种,或者问题是当我在服务器上返回值时?

我知道我可以在客户端删除符号“\”来解决这个问题,但这是我最后的选择,因为它不够干净。

编辑:

我通过在我的模型类中添加一个数组强制转换来解决它:

protected $casts = [
     'name' => 'string',
     'ects' => 'integer',
     'studies' => 'array'
];

文档可见here

【问题讨论】:

感谢您的解决方案,遇到了同样的问题,演员工作正常。 【参考方案1】:

看起来您正在对整个 eloquent collection 进行 json 编码,当您使用 get() 方法 (http://laravel.com/docs/5.1/eloquent-collections) 时会返回它。

来自 laravel 文档:

json 方法会自动将 Content-Type 标头设置为 application/json,以及使用 json_encode PHP 函数将给定数组转换为 JSON

所以本质上,您正在使用 json_encode() 将整个集合转换为 json,这将假定您的 json 字段是一个字符串,因此已将其转义。

【讨论】:

你给了我一个开始研究的地方,解决方案可以在编辑中看到。

以上是关于带有json类型字段的Laravel数据库在返回值时添加“”的主要内容,如果未能解决你的问题,请参考以下文章

带有 Laravel 的 Postgresql:使用子字符串过滤 Json 字段

Laravel 5.7 具有 JSON 字段类型的存在/唯一验证

在 MySQL JSON 字段中的数组中搜索值(Laravel/Lumen)[重复]

postman设置环境变量,字段值经过json转换后数值超过类型上限的解决方法

如何从 Laravel5 中的 json 类型响应中获取值

带有输入字段的 UITableView - 如何在进入详细视图并返回时保留值