web-dev-qa-db-ja.com

Laravel 4 InvalidArgumentException-予期しないデータが見つかりました。後続データ

私は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。

14
eComEvo

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 を確認してください。

25
The Alpha

元の質問はMySQLに関するものだと思いますが、MSSQLでも同じエラーが発生しました。問題は、MSSQLのdatetime列の型の精度が.001秒であることが判明しましたが、モデルの形式を精度なしに設定していました。

protected function getDateFormat()
{
    return 'Y-m-d G:i:s';
}

新しいDateTime2列タイプを使用して精度をオフにすることで、エラーを修正しました。つまり.

datetime2(0)

もちろん、getDateFormatの形式を変更することもできます。

6
voidstate

それが他の誰かを助ける場合、日付をコピーしようとすると同じエラーが発生しました。

$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;
}
0
Wireblue