我的Laravel模型带有日期字段archivedAt
。这已在模型的$dates
数组中设置,如下所示:
class Contact extends Model
{
/**
* The name of the table in the database.
*
* @laravel-table-name
*
* @var string
*/
protected $table = 'Contacts';
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = [
'createdAt',
'updatedAt',
'archivedAt'
];
}
当我尝试通过GraphQL向服务器发送JSON有效负载时,我得到以下回复:
{
"data": {
"editContact": null
},
"errors": [
{
"message": "Unexpected data found.\nTrailing data",
"locations": [
{
"line": 2,
"column": 3
}
]
}
]
}
当然,Laravel的GraphQL库非常糟糕,并且不包含完整的堆栈跟踪或任何其他信息,但这似乎是我设置archivedAt
字段的问题。以下是我如何做到这一点:
{
"operationName": null,
"variables": {
"contactEditForm": {
"id": "2",
"name": "Maybelle Collier",
"email": "cletus49@example.org",
"phone": "+1 (997) 381-8483",
"archivedAt": "2018-03-19T00:07:57.191Z",
"createdAt": "2018-03-18 23:57:30",
"updatedAt": "2018-03-18 23:57:30"
}
},
"query": "mutation ($contactEditForm: ContactEditForm!) {\n editContact(contactEditForm: $contactEditForm) {\n id\n name\n __typename\n }\n}\n"
}
如您所见,archivedAt
是一个ISO8601格式的字符串,它是在我的客户端上生成的:
(new Date())->toISOString();
然后应该将其保存在具有变异的GraphQL服务器上,如下所示:
public function resolve($root, $args, $context, ResolveInfo $info)
{
$contact = Contact::find($args['contactEditForm']['id']);
$contact->fill($args['contactEditForm']);
$contact->save();
return $contact;
}
为什么Laravel不喜欢这个?
答案 0 :(得分:1)
我从来没有遇到过这个问题,但根据Laravel's Docs,如果你在$ dates属性中设置字段,则要正确变异:
当列被视为日期时,您可以将其值设置为UNIX 时间戳,日期字符串(Y-m-d),日期时间字符串,当然还有 DateTime / Carbon实例,日期的值将自动生效 正确存储在您的数据库中:
所以,显然,mutator不允许使用ISO字符串日期,因此要么将其设置为其中一种格式defining an acessor(like this),要么将其从$ date中删除并自行处理