поймать ошибку ограничения целостности в symfony и доктрине - PullRequest
0 голосов
/ 20 июля 2011

У меня есть две таблицы: Категория:

|id | cat_name  |
| 1 | nameone   |
| 2 | nametwo   |   
| 3 | namethree |

Новости:

| id | id_cat | title    |
| 1  | 1      | title1 |
| 2  | 2      | title2 |
| 3  | 3      | title3 |
| 4  | 3      | title4 |
| 5  | 3      | title5 |

я использую doctrine: бэкэнд-категория для генерирующего модуля Category , и у меня есть список Category с executeEdit , Update и т. Д. Если я удаляю Category id 3 - namethree, то получаю ошибка

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено.

Как я могу убедиться, что если я удалю категорию 3, то все новости для категории 3 будут перемещены, например, в категорию 2 без ошибок? Как можно это поймать?

1 Ответ

0 голосов
/ 20 июля 2011

Вы должны настроить схему таблицы для News для обработки изменений внешнего ключа с помощью ON DELETE: либо «установлен в ноль», либо «установлен в значение по умолчанию», или «установлен в конкретное значение», или «удален»,Не уверен, что вы можете делать это по-разному, но если подумать, это было бы безумием: у вас есть ссылочная целостность точно , потому что вы хотите, чтобы ваши отношения строго соблюдались.Случайное изменение их при удалении строки категории полностью противоречит этому.

Намного лучше справиться с этим самостоятельно, сначала UPDATE с помощью строк, которые будут изменены.

UPDATE News SET id_cat = 2 WHERE id_cat = 3;
DELETE FROM Category WHERE id = 3;

(Я не знаю подходящего метода Symfony / Doctrine, чтобы повлиять на это.)

Доступные параметры зависят от вашей базы данных.Вы всегда можете сказать от ON DELETE CASCADE до удалить все зависимые строки;другие варианты могут быть или не быть вам доступны.

...