問題
ExcelからデータインポートをするSeederの実行時に、以下のエラーが発生した。 インポートするExcelファイルの1行目には、カラム名を指定している。エラー内容は以下のとおり。
ErrorException : Undefined index: id
at /var/www/csi/app/Imports/QuestionImport.php:20
17| public function model(array $row)
18| {
19| return new Question([
> 20| 'id' => $row['id'],
21| 'question_en' => $row['question_en'],
22| 'question_jp' => $row['question_jp'],
Exception trace:
1 Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Undefined index: id", "/var/www/csi/app/Imports/QuestionImport.php", [])
/var/www/csi/app/Imports/QuestionImport.php:20
2 App\Imports\QuestionImport::model()
/var/www/csi/vendor/maatwebsite/excel/src/Imports/ModelManager.php:73
Please use the argument -v to see more details.
原因
Importクラスで、implementsにWithHeadingRowを指定していなかった。(例)QuestionImport.php
class QuestionImport implements ToModel
{
public function model(array $row)
{
return new Question([
'id' => $row['id'],
'question_en' => $row['question_en'],
'question_jp' => $row['question_jp'],
]);
}
}
解決方法
Importクラスで、implementsにWithHeadingRowを指定する。(例)QuestionImport.php
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class QuestionImport implements ToModel, WithHeadingRow
{
public function model(array $row)
{
return new Question([
'id' => $row['id'],
'question_en' => $row['question_en'],
'question_jp' => $row['question_jp'],
]);
}
}
【参考】解決のために試したこと
20行目でエラーが出ていたので、18行目と19行目の間に ```dd($row);``` を入れてみた。ddの出力結果↓
array:6 [
0 => "id"
1 => "question_en"
2 => "question_jp"
]
1行目(ヘッダー行)もデータとして$rowに格納されていることが判明。これによりWithHeadingRowの指定漏れが原因と特定した。