带有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)[重复]