У меня есть следующая структура в базе данных:

В моем коде я сначала создаю компанию, затем журнал, затем ряд расписаний, затем пользователя, затем ответственность журнала. Что-то вроде этого (не точный код для краткости, но я не думаю, что это имеет значение):
<?php
$company = new Company();
$company->setSomething(123);
$logbook = new Logbook();
$logbook->setSomething('abc');
$logbook->setCompany($company);
$schedules = array();
for ($x=0; $x<$something; $x++) {
$schedule = new Schedule();
$schedule->setSomething(doSomethingWithSomething($something[$x]);
$schedule->setLogbook($logbook);
$schedules[] = $schedule;
}
$user = new User();
$user->setSomething('something');
$user->setCompany($company);
$user->setCurrentLogbook($logbook);
$logbookResponsibility = new LogbookResponsibility();
$logbookResponsibility->setLogbook($logbook);
$logbookResponsibility->setResponsibilityId(1);
$logbookResponsibility->setUser($user);
$errors = someFormOfCheck();
if (!$errors) {
$user->save();
$logbookResponsibility->save();
foreach ($schedules as $schedule) {
$schedule->save();
}
}
Я получаю следующую ошибку:
<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`logbook`.`logbook_responsibility`, CONSTRAINT `fk_logbook_responsbility_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE)' in C:\wamp\bin\php\php5.3.8\pear\propel\connection\DebugPDOStatement.php:90
Таблица logbook_responsibility состоит из трех внешних ключей, каждый из которых имеет RESTRICT для обновлений, потому что я не хочу, чтобы можно было удалить пользователя, журнал или тип ответственности, если существует ответственность в журнале. Однако я считаю, что проблема определяется порядком каскада.
Если я полностью вынимаю $logbookResponsibility частей, все работает отлично. Если я поставлю части $logbookResponsibility после $user->save();, а затем также выпущу $logbookResponsibility->save();, это также сработает отлично.
Тогда мой вопрос: где я ошибаюсь? Что я предполагаю неправильно или делаю неправильно, чтобы каскад работал? Или есть что-то еще, что может его остановить?
Обновление: если я сделаю следующее, все будет работать нормально:
$company->save();
$logbook->save();
$user->save();
$logbookResponsibility->save();
foreach ($schedules as $scheudle) {
$schedule->save();
}
то есть, если я сначала сохраню их вручную, а не полагаюсь на каскад.