我有一个实体学生,主题有作业。不幸的是,映射很奇怪,我现在不允许改变它,但是作业知道它们属于哪个科目,而且科目知道他们属于哪个学生,而不是相反。学生不知道其科目,其科目不知道其作业。我还有更多onDelete = CASCADE“所以默认情况下,学生将被删除,其主题与他们的作业一样。这样就可以了。
我想创建一张支票,如果学生的作业是开放作业,学生不能删除,也不是主题。
如果没有开放主题,我想删除学生,科目和作业。
我该怎么做?我想我已经有了这样的骨干;
public function preRemove(LifecycleEventArgs $args)
{
$em = $args->getEntityManager();
$student = $args->getEntity();
if ($student instanceof Student) {
$subjects = $em->getRepository(Subject::class)->findBy(['student' => $student]);
foreach ($subjects as $subject) {
if ($subject instanceof Subject) {
$assignments = $em->getRepository(Assignment::class)->findBy(['subject' => $subjects]);
foreach ($assignments as $assignment) {
if ($assignment->isCompleted()) {
echo $assignment." - CAN DELETE<br>";
} else {
echo $assignment." - CAN'T DELETE, THERE ARE OPEN ASSIGNMENTS!<br>";
}
}
}
}
}
}
现在什么是正确的方法?只返回true或false来停止或继续操作?或者我是否需要再次执行特定的Doctrine内容,例如删除等。我不是100%确定下一步该做什么。
如果无法删除作业,我还需要创建自定义例外。
有人可以帮忙吗?我会非常感激。
答案 0 :(得分:0)
我更喜欢创建服务并在每次需要检查此类操作时使用它。遗憾的是,教义事件和听众过于复杂,并且在很长一段时间内会带来更多有益的问题。当然,如果你这样做&#34;手动&#34;,你必须确保每次都将该控件委托给该服务,并且永远不要手动删除这些对象。此外,拥有一项服务可以使您的代码与ORM本身的联系更少。
顺便看看你的代码那里没有&#34;银弹回答&#34;对于这个,但我更喜欢Exception
(你的自定义类型),你需要知道发生了什么错误