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

eCo*_*Evo 13 php mysql laravel-4 php-carbon

我正在尝试获取一个Eloquent查询结果,DB::raw("DATE_FORMAT(created_at, '%m-%d-%Y %r') AS created_at")但每次我从Carbon获得此异常时:

InvalidArgumentException
Unexpected data found. Trailing data
Run Code Online (Sandbox Code Playgroud)

如果我改为将其created_at改为使用MySQL的DATE_FORMAT()功能,那么它就可以毫无问题地获取数据.

我之前不仅没有问题就完成了这种日期格式化,但我检查了数据库表中的每个字段(这个种子只有10个),每个都是标准的有效日期,所以我想知道为什么Carbon正在投球合身.

在Laravel 4.1中运行它.

The*_*pha 24

在一个Eloquent查询结果(模型)每date场是一个碳对象,这意味着,如果查询包含任何一个模型timestamp字段等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();
Run Code Online (Sandbox Code Playgroud)

因此,您可以直接在模型中可用Carbontimestamp字段上使用任何公共方法.如果你试试这个:

dd($user->created_at);
Run Code Online (Sandbox Code Playgroud)

然后输出将是:

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)
Run Code Online (Sandbox Code Playgroud)

所以,如果你想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')
Run Code Online (Sandbox Code Playgroud)

更新:

如果你想改变这种行为,意味着,如果你想告诉Laravel它,哪些字段应该自动转换为Carbon对象,那么你可以通过在模型中创建一个方法来覆盖它:

public function getDates()
{
    // only this field will be converted to Carbon
    return array('updated_at');
}
Run Code Online (Sandbox Code Playgroud)

要完全禁用日期突变,只需从getDates方法返回一个空数组.有关更多详细信息,请在网站上查看Date MutatorsLaravel.


voi*_*ate 6

我意识到原来的问题是指MySQL,但我和MSSQL有同样的错误.问题是MSSQL的datetime列类型的精度为.001秒,但我将模型的格式设置为无精度:

protected function getDateFormat()
{
    return 'Y-m-d G:i:s';
}
Run Code Online (Sandbox Code Playgroud)

通过使用较新的DateTime2列类型并关闭精度,我修复了错误.即

datetime2(0)
Run Code Online (Sandbox Code Playgroud)

getDateFormat当然,你可以改变格式.