LaravelでExcelファイルをインポートする際、日付部分が空欄である場合、1970-01-01として保存されてしまいます。
日付部分を空欄にしたいときには、困りますよね。
まずは理由を解説した上で、日付部分を1970-01-01からnullに変更する方法を紹介します。
LaravelでExcelの空欄日時をインポートすると 1970-01-01となる理由
Excelでは、UNIX時刻を使って、日時を計算しているそうです。
UNIX時刻では、1970年1月1日午前0時0分0秒を基準として、ここから経過した秒数で時刻が表示される。
つまり、デフォルト状態が1970年1月1日になるようです。
LaravelでExcelの空欄日時をインポートすると 1970-01-01となる時の対策
ただ、これではちょっと困りますよね。
これを力技で何とかするには、次のような方法が考えられます。
- インポートする際に firstOrCreateを利用
- その後、wasRecentlyCreatedで作成したデータを取得
- 2で取得したデータに1970-01-01があれば、nullに変換
インポートファイルの書き方
実際のコードは、次のようになります。
【DangoImportファイルの設定】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace App\Imports; use App\Models\Dango; use Maatwebsite\Excel\Row; use Maatwebsite\Excel\Concerns\OnEachRow; use Maatwebsite\Excel\Concerns\WithHeadingRow; use Carbon\Carbon; class DangoImport implements OnEachRow, WithHeadingRow { public function OnRow(Row $row) { $row=$row->toArray(); $dango=Dango::firstOrCreate( [ 'dango'=>$row['お団子の種類']], [ 'dango'=>$row['お団子の種類'], 'number'=>$row['数'], 'date'=>Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['販売日'])) ] ); if($dango->wasRecentlyCreated){ $date=Carbon::createFromFormat('Y-m-d H:i:s', $dango->date)->format('Y-m-d'); if($date=='1970-01-01'){ $dango->date=null; $dango->update(); } } } } |
ご参考までに、コントローラーは次のような感じになります。
【DangoImportファイルのためのコントローラー】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Http\Controllers; use App\Imports\DangoImport; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Http\Request; use App\Models\Dango; class DangoController extends Controller { public function import(){ $import=new DangoImport; Excel::import($import, request()->file('file')); return view('dango'); } } |
これによってインポートしたデータベースは、次のようにnullになります。
【エクセルファイル】
【上記をインポートしたデータベース】
じゅんこ
ちょっと力技かもしれませんが^^;
よかったら、お試しください。
なおLaravelにExcelファイルをインポート・エクスポートするときの方法は関連記事で色々取り上げています。
併せて参考にしてください。