Laravel 4中的Carbon InvalidArgumentException - 找到意外数据。追踪数据

时间:2014-06-11 16:56:03

标签: php mysql laravel-4 php-carbon

我正在尝试获取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中运行。

3 个答案:

答案 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;
}