Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Есть три таблицы, две из них с внешними ключами:
Таблица comments
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('client_id')->unsigned()->default('0');
$table->foreign('client_id')->references('id')->on('clients')->onUpdate('cascade')->onDelete('cascade');
$table->text('message');
$table->timestamps();
});
Таблица clients
Schema::create('clients', function (Blueprint $table) {
$table->increments('id');
$table->text('email');
$table->text('name');
$table->text('position')->nullable();
$table->integer('location_id')->unsigned();
$table->foreign('location_id')->references('id')->on('locations')->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
Таблица locations
Schema::create('locations', function (Blueprint $table) {
$table->increments('id');
$table->text('ip');
$table->text('country')->nullable();
$table->text('department');
$table->text('timezone');
$table->timestamps();
});
Фрагмент из контроллера
$comment = new Comment();
$comment -> client() -> email = $request -> input('email');
$comment -> client() -> name = $request -> input('name');
$comment -> client() -> position = $request -> input('position');
$comment -> message = $request -> input('message');
$comment -> save();
При попытке добавить запись в эти таблицы получаю ошибку.
Текст ошибки
Illuminate \ Database \QueryException (23000)
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`landing`.`comments`, CONSTRAINT `comments_client_id_foreign` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `comments` (`message`, `updated_at`, `created_at`) values (dfgdgdgdf, 2017-10-28 10:31:06, 2017-10-28 10:31:06))
Читал инфу по коду этой ошибки. Советуют проверить соответствие названий и типов внешних ключей. Ключи перепроверил, не смог найти косяк. Либо чего-то еще не знаю, либо чего-то не заметил. Подскажите если кто заметит косяк.
И еще один вопрос: я правильно понимаю, что при добавлении записи в таблицу clients (см. фрагмент из контроллера), автоматически заполнится соответствующая запись в таблице comments (колонка client_id)? Я полагаю это должен обеспечить метод onUpdate('cascade').
Изменено Antuan (29.10.2017 21:00:09)
Не в сети
Это происходит из-за того, что ты пытаешься добавить foreign key constraint до того, как таблица clients была создана. Измени время в названии файлов миграции так, чтобы сначала создалась таблица locations, потом clients и уже потом comments.
Не в сети
Измени время в названии файлов миграции так, чтобы сначала создалась таблица locations, потом clients и уже потом comments.
Так и есть:
/migrations/2017_10_27_213205_CreateLocationsTable.php
/migrations/2017_10_27_213314_CreateClientsTable.php
/migrations/2017_10_27_213401_CreateCommentsTable.php
Перед этим у меня действительно был неправильный порядок миграций. Но я тогда просто не смог их запустить по той же причине. После этого я не менял время, а пересоздал их в нужном порядке. В самой БД я удалил таблицу migrations, других таблиц не было. Может что-то закешировалось?
Изменено Antuan (29.10.2017 21:40:42)
Не в сети
Я думал, что ошибка при запуске миграций, извиняюсь.
У тебя не передается значение client_id. Сделай так:
$client = Client::create($request->only('email', 'name', 'position'));
$client->comment()->create($request->only('message'));
Не забудь добавить $fillable в обе модели.
Изменено AlexeyMezenin (29.10.2017 21:58:24)
Не в сети
Имел такую же проблему:
Illuminate \ Database \QueryException (23000)
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
У меня проблема решилась, тогда когда понял что добавленный позже в миграцию foreign_key "user_id", не добавлен в переменную fillable[...] что перечисляется в модели..
Как только добавил все заработало!
Изменено DmitryPHP (14.12.2019 22:29:39)
Не в сети