web-dev-qa-db-ja.com

カーボン日付をmysqlタイムスタンプに変換します。

Mysqlデータベースにタイムスタンプ変数列があります。 Carbonタイムスタンプを入力可能なものに変換しようとしましたが、Carbon::now()はCarbonオブジェクトのみを返し、Carbonオブジェクトのタイムスタンプ文字列を使用しようとすると、mysqlに登録されません。

public function store(CreateArticleRequest $request){
        $input = $request->all(); 
        var_dump($input); // JUST SO YOU CAN SEE
        $input['published_at'] = Carbon::now(); 
        var_dump($input); // JUST SO YOU CAN SEE
        Article::create($input);   
}

私の最初のvarダンプは次のようなものです:

array (size=4)
  '_token' => string 'Wy67a4hWxrnfiGz61wmXfYCSjAdldv26wOJiLWNc' (length=40)
  'title' => string 'ASDFasdf' (length=8)
  'body' => string 'asdfasdf' (length=8)
  'published_at' => string '2015-08-26' (length=10)  

私の2番目のvarダンプはそうです。

「published_at」に関連するmysql列はタイムスタンプ変数です。これをCarbonオブジェクトからどのように変換すると思いますか?

前もって感謝します。

12
1N5818

簡単な答えは、toDateTimeString()があなたが探しているものだということです:

_$input['published_at'] = Carbon::now()->toDateTimeString();
_

時刻ではなく日付部分だけが必要な場合は、toDateString()など、その他のオプションについて http://carbon.nesbot.com/docs/ を参照してください。

しかし、それを処理するさらに良い方法は、Laravel Carbonオブジェクトとの間で日付値のキャストを処理できるようにすることです。 https://laravel.com/docs /5.4/eloquent-mutators#date-mutators

24
orrd

問題は日付文字列にあります。たとえば、次のようになります。

_public function setCrbDateAttribute($value)
{
     $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
}
_

現在、10-12-2014のような日付がある場合、時間と分が欠落しているため、このエラーが発生します。したがって、日付にすべてのparが含まれていることを確認し、日付文字列に/ではなく区切り文字として-が含まれていることも確認します。

言い換えれば、Carbonを使用する前に$ valueをチェックし、メソッドで使用したのとまったく同じフォーマットの文字列が日付文字列に含まれていることを確認してください。

これはアクセサメソッドでも発生するため、Carbon::createFromFormat().で使用する前に最初に日付値を確認してください。

ユーザー入力から日付を取得している場合は、dateまたはdate_format:formatルールを使用して日付を検証してから、ここで検証を確認してください。

回答番号:

Laravel/Carbonタイムスタンプ0000-00-00 00:00:00または予期しないデータが見つかりました。予期しないデータが見つかりました。データがありません

5
iCoders