Laravel 碳数据缺失
Laravel Carbon Data Missing
在我的模型中,我有以下内容:
protected $dates = [
'start',
'end',
'created_at',
'updated_at'
];
我正在使用日期时间选择器插入开始日期和结束日期,格式如下:
2016-01-23 22:00
没有秒。当我这样做时,出现此错误:
InvalidArgumentException in Carbon.php line 425:
Data missing
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-01-23 22:00') in Model.php line 3015
如果我确实包括秒数,它会起作用。秒数对我来说并不重要,我不想将它们包含在我的日期时间选择器字段中。有什么办法可以解决这个问题,这样我仍然可以将这些字段用作日期字段吗?
您需要在模型中将 protected $dateFormat
设置为 'Y-m-d H:i
',请参阅 https://laravel.com/docs/5.2/eloquent-mutators#date-mutators
您可以按照 Christian 的说法在您的模型中设置 $dateFormat,但是如果您不想在操作中暗示 updated_at 和 created_at 字段,您可以使用事件 "correct" 保存到数据库之前的日期时间对象。
型号
此功能已禁用,Datetimes 中碳的仿真
https://laravel.com/docs/5.0/eloquent#date-mutators
public function getDates()
{
return [];
}
tl;博士
您的日期字符串和日期格式不同,您必须更改格式字符串或修改日期字符串以使其匹配。
说明
问题
当 Carbon 的 createFromFormat
函数接收到与传递的格式字符串不匹配的日期字符串时,会出现此错误。更准确地说,这来自 DateTime::createFromFormat
函数,因为 Carbon 只是调用它:
public static function createFromFormat($format, $time, $tz = null)
{
if ($tz !== null) {
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
} else {
$dt = parent::createFromFormat($format, $time); // Where the error happens.
}
if ($dt instanceof DateTime) {
return static::instance($dt);
}
$errors = static::getLastErrors();
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors'])); // Where the exception was thrown.
}
数据不足
如果您的日期字符串 "shorter" 比本例中的格式字符串:
Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-04 00:52');
Carbon 会抛出:
InvalidArgumentException in Carbon.php line 425:
Data missing
数据过多
如果您的日期字符串 "longer" 比本例中的格式字符串:
Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');
Carbon 会抛出:
InvalidArgumentException in Carbon.php line 425:
Trailing data
引擎盖下
根据 documentation on mutators the default date format is: 'Y-m-d H:i:s'
. The date processing happens in the Model's asDateTime
function. In the last condition the getDateFormat
function is called, thats where the custom format comes from. The default format is defined in the Database's Grammar
class.
解决方案
您必须确保日期字符串与格式字符串匹配。
更改格式字符串
您可以像这样覆盖默认格式字符串:
class Event extends Model {
protected $dateFormat = 'Y-m-d H:i';
}
这种方法有两个问题:
- 这将应用于模型的
$dates
数组中定义的每个字段。
- 您必须在数据库中以这种格式存储数据。
编辑和格式化日期字符串
我推荐的解决方案是日期格式应保持默认 'Y-m-d H:i:s'
并且您应该补全日期的缺失部分,如下所示:
public function store(Request $request) {
$requestData = $request->all();
$requestData['start_time'] .= ':00';
$requestData['end_time'] .= ':00';
$event = new Event($requestData);
$event->save();
}
当你想使用日期时,你应该格式化它:
public function show(Request request, $eventId) {
$event = Event::findOrFail($eventId);
$startTime = $event->start_time->format('Y-m-d H:i');
$endTime = $event->end_time->format('Y-m-d H:i');
}
当然应该将字段更改为日期:
class Event extends Model {
protected $dates = [
'start_time',
'end_time',
'created_at',
'updated_at',
'deleted_at',
];
}
确保您没有遗漏数据库中某些行中的 "created_at" 或 "updated_at" 字段,这些字段是必需的;如果是这种情况,请删除具有这些空字段的记录或以有效时间戳格式输入值,例如“2018-09-01 15:18:53”。
这是一种可能
您需要检查结果数据的列。如果您的列名 'created_at' 或 'updated_at' 为空,那么它将通过此错误。
如何解决?
首先,您需要使用 Laravel carbon 将数据存储在这两列中。
例如:
$user = new User();
$user->created_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->updated_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->save();
就这些了,希望有用
快乐编码....
对我来说,问题出在供应商 (vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\SqlServerGrammar.php) 中的 SQLServerGrammar。
SQLServerGramma 中的默认值为 Y-m-d H:i:s.v
.
我们扩展了 class 端删除了 .v
。
在我的模型中,我有以下内容:
protected $dates = [
'start',
'end',
'created_at',
'updated_at'
];
我正在使用日期时间选择器插入开始日期和结束日期,格式如下:
2016-01-23 22:00
没有秒。当我这样做时,出现此错误:
InvalidArgumentException in Carbon.php line 425:
Data missing
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-01-23 22:00') in Model.php line 3015
如果我确实包括秒数,它会起作用。秒数对我来说并不重要,我不想将它们包含在我的日期时间选择器字段中。有什么办法可以解决这个问题,这样我仍然可以将这些字段用作日期字段吗?
您需要在模型中将 protected $dateFormat
设置为 'Y-m-d H:i
',请参阅 https://laravel.com/docs/5.2/eloquent-mutators#date-mutators
您可以按照 Christian 的说法在您的模型中设置 $dateFormat,但是如果您不想在操作中暗示 updated_at 和 created_at 字段,您可以使用事件 "correct" 保存到数据库之前的日期时间对象。
型号
此功能已禁用,Datetimes 中碳的仿真 https://laravel.com/docs/5.0/eloquent#date-mutators
public function getDates()
{
return [];
}
tl;博士
您的日期字符串和日期格式不同,您必须更改格式字符串或修改日期字符串以使其匹配。
说明
问题
当 Carbon 的 createFromFormat
函数接收到与传递的格式字符串不匹配的日期字符串时,会出现此错误。更准确地说,这来自 DateTime::createFromFormat
函数,因为 Carbon 只是调用它:
public static function createFromFormat($format, $time, $tz = null)
{
if ($tz !== null) {
$dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
} else {
$dt = parent::createFromFormat($format, $time); // Where the error happens.
}
if ($dt instanceof DateTime) {
return static::instance($dt);
}
$errors = static::getLastErrors();
throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors'])); // Where the exception was thrown.
}
数据不足
如果您的日期字符串 "shorter" 比本例中的格式字符串:
Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-04 00:52');
Carbon 会抛出:
InvalidArgumentException in Carbon.php line 425:
Data missing
数据过多
如果您的日期字符串 "longer" 比本例中的格式字符串:
Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');
Carbon 会抛出:
InvalidArgumentException in Carbon.php line 425:
Trailing data
引擎盖下
根据 documentation on mutators the default date format is: 'Y-m-d H:i:s'
. The date processing happens in the Model's asDateTime
function. In the last condition the getDateFormat
function is called, thats where the custom format comes from. The default format is defined in the Database's Grammar
class.
解决方案
您必须确保日期字符串与格式字符串匹配。
更改格式字符串
您可以像这样覆盖默认格式字符串:
class Event extends Model {
protected $dateFormat = 'Y-m-d H:i';
}
这种方法有两个问题:
- 这将应用于模型的
$dates
数组中定义的每个字段。 - 您必须在数据库中以这种格式存储数据。
编辑和格式化日期字符串
我推荐的解决方案是日期格式应保持默认 'Y-m-d H:i:s'
并且您应该补全日期的缺失部分,如下所示:
public function store(Request $request) {
$requestData = $request->all();
$requestData['start_time'] .= ':00';
$requestData['end_time'] .= ':00';
$event = new Event($requestData);
$event->save();
}
当你想使用日期时,你应该格式化它:
public function show(Request request, $eventId) {
$event = Event::findOrFail($eventId);
$startTime = $event->start_time->format('Y-m-d H:i');
$endTime = $event->end_time->format('Y-m-d H:i');
}
当然应该将字段更改为日期:
class Event extends Model {
protected $dates = [
'start_time',
'end_time',
'created_at',
'updated_at',
'deleted_at',
];
}
确保您没有遗漏数据库中某些行中的 "created_at" 或 "updated_at" 字段,这些字段是必需的;如果是这种情况,请删除具有这些空字段的记录或以有效时间戳格式输入值,例如“2018-09-01 15:18:53”。
这是一种可能
您需要检查结果数据的列。如果您的列名 'created_at' 或 'updated_at' 为空,那么它将通过此错误。
如何解决? 首先,您需要使用 Laravel carbon 将数据存储在这两列中。 例如:
$user = new User();
$user->created_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->updated_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->save();
就这些了,希望有用
快乐编码....
对我来说,问题出在供应商 (vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\SqlServerGrammar.php) 中的 SQLServerGrammar。
SQLServerGramma 中的默认值为 Y-m-d H:i:s.v
.
我们扩展了 class 端删除了 .v
。