我正在尝试获取DB::raw("DATE_FORMAT(created_at, '%m-%d-%Y %r') AS created_at")
的Eloquent查询结果,但每次我从Carbon获得此异常时:
InvalidArgumentException
Unexpected data found. Trailing data
如果我将其更改为created_at
而不是使用MySQL的DATE_FORMAT()
函数,那么它会毫无问题地获取数据。
我之前不仅没有问题就完成了这种日期格式化,但我检查了数据库表中的每个字段(这个种子只有10个),每个都是标准的有效日期,所以我想知道为什么碳正在变得合适。
在Laravel 4.1中运行。
答案 0 :(得分:24)
在Eloquent
查询结果(模型)中,每个date
字段都是carbon object,这意味着,如果您查询包含任何timestamp
字段的模型,例如{{ 1}},created_at
(基本上是在迁移期间使用updated_at
创建的)和timestamps()
,deleted_at
将它们转换为Laravel
对象,您可以使用任何公共方法Carbon
的例如:
Carbon
因此,您可以在模型中可用的$user = User::find(1);
// '2014-04-20 19:02:09' will become 'Apr 20, 2014'
$user->created_at->toFormattedDateString();
字段上直接使用Carbon
的任何公共方法。如果你试试这个:
timestamp
然后输出将是:
dd($user->created_at);
因此,如果您想object(Carbon\Carbon)[456]
public 'date' => string '2014-04-20 19:02:09' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
约会,可以使用:
format
如果要更改此行为,则表示如果您想告诉// outputs like: 'Sunday 20th of April 2014 07:02:09 PM'
$user->created_at->format('l jS \\of F Y h:i:s A')
哪些字段应自动转换为Laravel
对象,则可以通过在模型中创建方法来覆盖该字段像:
Carbon
要完全禁用日期突变,只需从public function getDates()
{
// only this field will be converted to Carbon
return array('updated_at');
}
方法返回一个空数组。有关详情,请查看getDates
网站上的Date Mutators。
答案 1 :(得分:6)
我意识到原来的问题是指MySQL,但我和MSSQL有同样的错误。问题是MSSQL的datetime列类型的精度为.001秒,但我将模型的格式设置为无精度:
protected function getDateFormat()
{
return 'Y-m-d G:i:s';
}
通过使用较新的DateTime2列类型并关闭精度,我修复了错误。即。
datetime2(0)
当然,您可以更改getDateFormat
中的格式。
答案 2 :(得分:0)
如果它对其他人有帮助,我在尝试复制日期时遇到了同样的错误。
$user->last_login = Carbon::now();
if ($user->first_login < Carbon::createFromDate(2000, 1, 1)) {
// This is the users first login
$user->first_login = $user->last_login; // FAILS!
}
结果Laravel将$user->last_login
的值转换为DateTime + Timezone字符串。它不再是碳物体。
您可以通过使用单个Carbon对象的副本(下面的示例)或通过在基础模型上设置mutator(setter)来修复错误。
$now = Carbon::now();
$user->last_login = $now;
if ($user->first_login < Carbon::createFromDate(2000, 1, 1)) {
// This is the users first login
$user->first_login = $now;
}