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ファイルの設定】
<?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ファイルのためのコントローラー】
<?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ファイルをインポート・エクスポートするときの方法は関連記事で色々取り上げています。
併せて参考にしてください。



コメント