前置き
Webを検索しても解決方法が見つかりづらかったので、備忘のために記録します。
動作環境
php 7.4
laravel 6.0
mysql 8.0
状況
php artisan migrate:refresh --seed
を実行したときに、
Illuminate\Database\QueryException : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count
というエラーが出た。
原因
原因はseederファイルで作成したカラムの数が違っていることでした。
php artisan migrate:refresh --seed
でサンプルデータを作る場合、サンプルのデータをコメントアウトしたり追加したりすると、このようなエラーが発生してしまうということです。
対策
シーダーファイルの書き方を変えればコメントアウトした場合でもエラーが出ないようにすることが出来た。以下、その方法を書きます。
以下のような書き方をすると、レコードの一部のカラムをコメントアウトや追加した場合に、上記のエラーが発生してしまいます。
<?php
use Illuminate\Database\Seeder;
class PropertiesTableSeeder extends Seeder
{
public function run()
{
DB::table('テーブル名')->insert([
['name' => 'だんご',
'project_id' => 1,
'maker_name' => '鈴木商店',
'product_type' => '食品'
],
['name' => 'なす',
'project_id' => 2,
//'maker_name' => '山田農園', ← このようにコメントアウトするとエラーになる
'product_type' => '食品'],
]);
// 上記シーダーファイルで、山田農園をコメントインして以下を実行すると成功。
php artisan migrate:refresh --seed
結果(成功)
Database seeding completed successfully.
// コメントアウトして以下を実行するとSQLSTATE[21S01]のエラー。
php artisan migrate:refresh --seed
結果(エラー発生)
Illuminate\Database\QueryException : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 2
解決したコードの例
シーダーで作成するサンプルデータのカラム内容を追加したりコメントアウトする可能性がある場合は、以下のようにDB::table('テーブル名')->insertを分けて書くと、エラーを発生させずに実行することが出来ます。
class PropertiesTableSeeder extends Seeder
{
public function run()
{
DB::table('テーブル名')->insert([
['name' => 'だんご',
'project_id' => 1,
'maker_name' => '鈴木商店',
'product_type' => '食品'],
]);
DB::table('テーブル名')->insert([
['name' => 'なす',
'project_id' => 2,
//'maker_name' => '山田農園',
'product_type' => '食品'
],
]);
}
}
DB::table('テーブル名')->insertをレコードごとに分けて実行するだけです。つまり、DB::table('テーブル名')->insertの行を一回しか書きたくない場合は、作成したいサンプルのカラム数を全て合わせる」ということですね。
// シーダーファイルで、コメントインしようがアウトしようがエラーは発生しません。
php artisan migrate:refresh --seed
結果
Database seeding completed successfully.
感想
ベテランの人たちはどんな書き方ややり方でやっているのか知りたいです。カラム数が100個くらいあるテーブルだとシーダーファイルでサンプルを作ると大変ですし。