Сеялка Laravel не заполняет таблицу внешними ключамиPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Сеялка Laravel не заполняет таблицу внешними ключами

Сообщение Anonymous »

Я работаю над проектом Laravel, и у меня есть следующие миграции:

Код: Выделить всё

public function up(): void
{
Schema::create('customers', function (Blueprint $table) {
$table->id('customer_id');
$table->string('first_name', 50);
$table->string('last_name', 50);
$table->string('address', 100)->nullable();
$table->string('phone', 15)->nullable();
$table->string('email', 50)->unique();
$table->timestamp('registration_date')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('customers');
}

Код: Выделить всё

public function up(): void
{
Schema::create('vehicles', function (Blueprint $table) {
$table->id('vehicle_id');
$table->foreignId('customer_id')->constrained('customers')->onDelete('cascade');
$table->string('make', 50);
$table->string('model', 50);
$table->year('year');
$table->string('license_plate', 15)->unique();
$table->string('vin', 17)->unique();
$table->string('color', 20)->nullable();
$table->timestamp('registration_date')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('vehicles');
}
Как видно из таблицы транспортных средств, существует внешний ключ, ссылающийся на таблицу клиентов. Я покажу вам взаимосвязь в моделях:

Код: Выделить всё

class Vehicle extends Model
{
use HasFactory;

/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'vehicle_id';

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'customer_id',
'make',
'model',
'year',
'license_plate',
'vin',
'color',
'registration_date',
];

public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class, 'customer_id');
}
}

Код: Выделить всё

class Customer extends Model
{
use HasFactory;

/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'customer_id';

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'first_name',
'last_name',
'address',
'phone',
'email',
'registration_date',
];

public function vehicles(): HasMany
{
return $this->hasMany(Vehicle::class, 'customer_id');
}
}
И, наконец, фабрики:

Код: Выделить всё

class CustomerFactory extends Factory
{
protected $model = Customer::class;

/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
return [
'first_name' => fake()->name(),
'last_name' => fake()->lastName(),
'address' => fake()->address(),
'phone' => fake()->phoneNumber(),
'email' => fake()->email(),
'registration_date' => fake()->date(),
];
}
}

class VehicleFactory extends Factory
{
protected $model = Vehicle::class;

/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
return [
'customer_id' => Customer::factory(),
'make' => fake()->company,
'model' => fake()->word,
'year' => fake()->year,
'license_plate' => strtoupper(fake()->unique()->bothify('???-####')),
'vin' => strtoupper(fake()->unique()->bothify('?????????????????')),
'color' => fake()->safeColorName,
'registration_date' => fake()->date(),
];
}
}
По-видимому, возникает следующая ошибка:

Код: Выделить всё

SQLSTATE[HY000]: General error: 1 foreign key mismatch - "vehicles" referencing "customers" (Connection: sqlite, SQL: insert into "vehicles" ("customer_id", "make", "model", "year", "license_plate", "vin", "color", "registration_date", "updated_at", "created_at") values (11, Wilderman Group, nostrum, 1970, VRF-4423, FVKRDKQWQHGDVFWBP, purple, 2019-01-16, 2024-11-13 18:30:33, 2024-11-13 18:30:33))
Эта ошибка связана с попыткой добавить внешний ключ в таблицу транспортных средств для клиента с идентификатором 11, которого явно не существует, поскольку для него создано только 10 клиентов. 15 автомобилей. Я попытался «заставить» ошибку исчезнуть, пройдя по всем созданным автомобилям и назначив их существующим клиентам, но это привело к еще одной ошибке. Я думаю, что здесь, скорее всего, что-то не так, и исправить это будет гораздо проще, чем пытаться решить проблему способом, для которого фреймворк не предназначен. Если кто-нибудь знает, что может быть не так, буду признателен за помощь.
P.S. Я использую Laravel 11

Подробнее здесь: https://stackoverflow.com/questions/791 ... reing-keys
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»