SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'エラーの解決方法

実現したいこと

Laravelのfactoryを使ったテストコードを記述したら、エラーが生じた。
テストコードが通るようにしたい。

前提

Laravelのfactoryを使って、テストをコード書いた際に下記のエラーが生じた。
・setUp内の変数は別のテストコードで使用している。
・testJobAssertStatusWithNoImageJobOffer内で使うComInfoモデルのデータを定義したい。

発生している問題・エラーメッセージ

1) Tests\Feature\Http\Controllers\Main\JobListControllerTest::testJobAssertStatusWithNoImageDentalStyleJobOffer Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY' (SQL: insert into `city_infos` (`prefecture_id`, `city_cd`, `prefecture_name`, `city_name`, `prefecture_name_rome`, `city_name_rome`, `updated_at`, `created_at`) values (7, 230, Larrymouth, West Easterland, totam, eum, 2022-01-24 19:06:23, 2023-02-03 18:04:00))

該当のソースコード

PHP

1<?php2 3namespace Tests\Feature\Http\Controllers\Main;4use App\CityInfo;5use App\ComInfo;6use App\ComJob;7use Illuminate\Foundation\Testing\DatabaseTransactions;8use Tests\TestCase;9use Illuminate\Database\Eloquent\Factories\HasFactory;10 11 12 13 14 15class JobListControllerTest extends TestCase16{17 use DatabaseTransactions;18 use HasFactory;19 20 private $job;21 22 public function setUp(): void23 {24 parent::setUp();25 26 $this->job = ComJob::factory()27 ->valid()28 ->create([29 'comid' => ComInfo::factory()30 ->valid()31 ->create([32 'city_cd' => CityInfo::factory()33 ]),34 'state' => 1,35 ]);36 }37 38 39 40 41 42 public function testJobAssertStatusWithNoImageJobOffer()43 {44 $job_no_image = ComJob::factory()45 ->valid()46 ->create([47 'comid' => ComInfo::factory()48 ->valid()49 ->create([50 'city_cd' => CityInfo::factory(),51 'photourl' => '',52 'device_photo_1' => null,53 'device_photo_2' => null,54 'device_photo_3' => null,55 'device_photo_4' => null,56 'device_photo_5' => null,57 'device_photo_6' => null,58 'device_photo_7' => null,59 'device_photo_8' => null,60 'device_photo_9' => null,61 'device_photo_10' => null,62 'device_photo_11' => null,63 'device_photo_12' => null,64 'device_photo_13' => null,65 'device_photo_14' => null,66 ]),67 'state' => 1,68 ]);69 $response = $this->get('/joblist/' . $job_no_image->id);70 $response->assertStatus(200);71 }72}73

試したこと

主キー制約の重複によって引き起こされているので、CityInfoFactoryクラスのid(主キー)にuniqueメソッドを追加。

<?php namespace Database\Factories; use App\CityInfo; use Faker\Generator as Faker; use Illuminate\Database\Eloquent\Factories\Factory; class CityInfoFactory extends Factory { protected $model = CityInfo::class; public function definition() { return [ 'id' => $this->faker->unique()->numberBetween(1, 10000), 'prefecture_id' => $this->faker->numberBetween(1, 47), 'city_cd' => $this->faker->numberBetween(100, 699), 'prefecture_name' => $this->faker->city, 'city_name' => $this->faker->city, 'prefecture_name_rome' => $this->faker->word, 'city_name_rome' => $this->faker->word, 'updated_at' => $this->faker->dateTime(), ]; } }

テストは通らずに下記のエラーが発生

[previous exception] [object] (ErrorException(code: 0): Attempt to read property \"id\" on null at /var/www/storage/framework/views/fccee8ff7ff1b2984c57e75f46f03b88bf2d6d20.php:117)

補足情報(FW/ツールのバージョンなど)

環境:PHP 8.1、Laravel8
テストフレームワーク PHPUnit

何かご助言頂けますと幸いです。

コメントを投稿

0 コメント