Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 29.10.2017 20:59:26

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add ...

Есть три таблицы, две из них с внешними ключами:
Таблица 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)

Не в сети

#2 29.10.2017 21:28:58

Re: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add ...

Это происходит из-за того, что ты пытаешься добавить foreign key constraint до того, как таблица clients была создана. Измени время в названии файлов миграции так, чтобы сначала создалась таблица locations, потом clients и уже потом comments.

Не в сети

#3 29.10.2017 21:39:43

Re: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add ...

Измени время в названии файлов миграции так, чтобы сначала создалась таблица 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)

Не в сети

#4 29.10.2017 21:57:51

Re: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add ...

Я думал, что ошибка при запуске миграций, извиняюсь.

У тебя не передается значение client_id. Сделай так:

$client = Client::create($request->only('email', 'name', 'position'));
$client->comment()->create($request->only('message'));

Не забудь добавить $fillable в обе модели.

Изменено AlexeyMezenin (29.10.2017 21:58:24)

Не в сети

#5 14.12.2019 22:25:59

Re: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add ...

Имел такую же проблему:
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)

Не в сети

Подвал раздела