Laravel по-русски

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

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

#1 22.08.2015 14:52:04

Max_G
Откуда: Одесса, Украина
Сообщений: 55

Cannot add or update a child row: a foreign key constraint fails

Принял данные, накидал их в $data (после загрузки изображения и перехвата его урла, что не тема вопроса), сделал:
self::create($data);

Получил:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`site`.`images`, CONSTRAINT `images_content_id_foreign` FOREIGN KEY (`content_id`) REFERENCES `contents` (`id`)) (SQL: insert into `images` (`src`, `text`, `sequence`, `face`, `updated_at`, `created_at`) values (/upload/butterfly01.jpg, , 1, 1, 2015-08-22 11:41:45, 2015-08-22 11:41:45))

Что делать?
(это главный вопрос)

Раньше (до ларавела) я легко обходился без объявления внешних ключей, просто вручную соединял таблицы.
В чём смысл объявления внешних ключей, если они лишь мешают?
(это философский и не главный вопрос)

Не в сети

#2 22.08.2015 15:17:22

Re: Cannot add or update a child row: a foreign key constraint fails

  1. В чём смысл объявления внешних ключей, если они лишь мешают?
  2. (это философский и не главный вопрос)

Это как раз главный вопрос, надо разобраться, зачем нужны ключи. Без ключей у вас 100% рано или поздно появятся потерянные куски данных, то есть изображения без сайтов (в данном случае). Это будет большая проблема для кода, потому что он ожидает, что все ID действительно существуют. Это может быть и проблема для запросов с JSON, агрегатными функциями и т.п.

Чтобы этого не было нужно действовать от обратного: сначала создавать независимые от других таблиц/записей записи, потом создавать связанные с ними записи, и всё это оборачивать в транзакцию. В этом случае при ошибке у вас никогда не появится «заброшенных» (orphaned) ID, так как все такие записи будут удалены самой БД.

Если есть записи, которые зависят друг от друга (это спорный с точки зрения архитектуры момент, но всё же), то можно выставлять поля, для которых значение ID не известно, в null, а потом заполнять их отдельным запросом.

Не в сети

#3 22.08.2015 15:18:21

Max_G
Откуда: Одесса, Украина
Сообщений: 55

Re: Cannot add or update a child row: a foreign key constraint fails

Не могу удалить тему. А надо бы.
Это моя ошибка, вряд ли кому может пригодиться эта тема.
[content_id шёл в адресе, я его тупо не включил в запрос]

Не ожидал молниеносной реакции на русскоязычном форуме по не самому популярному фреймворку.

Изменено Max_G (22.08.2015 15:23:48)

Не в сети

#4 22.08.2015 15:18:57

Re: Cannot add or update a child row: a foreign key constraint fails

Не надо удалять, вопросы возникают не только у вас.

Не в сети

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