私はDB::raw("DATE_FORMAT(created_at, '%m-%d-%Y %r') AS created_at")
のEloquentクエリ結果を取得しようとしていますが、Carbonからこの例外を受け取るたびに:
_InvalidArgumentException
Unexpected data found. Trailing data
_
MySQLのDATE_FORMAT()
関数を使用する代わりに、単に_created_at
_に変更すると、問題なくデータが取得されます。
私は以前にこの種の日付フォーマットを問題なく行っただけでなく、データベーステーブルのすべてのフィールド(このシードには10しかない)をチェックし、それぞれが標準の有効な日付であるため、Carbonがなぜピッチしているのか疑問に思っていますフィット。
これをLaravel 4.1。
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();
_
したがって、モデルで使用可能な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
メソッドから空の配列を返すだけです。詳細については、Laravel
Webサイトの Date Mutators を確認してください。
元の質問はMySQLに関するものだと思いますが、MSSQLでも同じエラーが発生しました。問題は、MSSQLのdatetime列の型の精度が.001秒であることが判明しましたが、モデルの形式を精度なしに設定していました。
protected function getDateFormat()
{
return 'Y-m-d G:i:s';
}
新しいDateTime2列タイプを使用して精度をオフにすることで、エラーを修正しました。つまり.
datetime2(0)
もちろん、getDateFormat
の形式を変更することもできます。
それが他の誰かを助ける場合、日付をコピーしようとすると同じエラーが発生しました。
$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オブジェクトではありません。
単一のCarbonオブジェクトのコピー(以下の例)を使用するか、基になるモデルにミューテーター(セッター)を設定することで、エラーを修正できます。
$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;
}