从早上开始我就一直在尝试解决一个问题,但我无法解决。我正在做一个使用Symfony 6和PHP 8.0的项目。
学生和年级之间有一个一对多的连接-〉每个学生可以有多个年级对象。每个年级与一个学生相关。
但是在Grade实体中,我在Grade和Course之间还有一个ManyToOne链接-〉每个Grade都与一个Course相关,每个Course可以有很多Grade对象。
当我从Student数据表中删除学生的成绩时,在Grade数据表中会遇到类似以下的行为:studentID已删除,但courseID仍保留。我希望删除Grade表中的整个条目。
我试图从Student表中为grade属性添加orphanRemove = true
,结果更糟。该课程的所有成绩都被删除,包括课程。我可以理解为什么会发生这种情况。这是因为我将Grade同时链接到Student类和Course类,然后遇到了这个问题:* 当使用orphanRemoval=true选项时,Doctrine假设实体是私有的,不会被其他实体重复使用。如果忽略此假设,则即使您将孤立实体分配给另一个实体,Doctrine也会删除您的实体 *
我想知道如何解决这个问题。创建一个cron作业来删除所有student_id = null的成绩是一个好的解决方案还是有更好的替代方案?
第一个
我还尝试添加 nullable = false,例如:
#[
ORM\ManyToOne(targetEntity: Student::class, inversedBy: 'grades'),
ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')
]
protected ?Student $student;
#[
ORM\ManyToOne(targetEntity: Course::class, inversedBy: 'grades'),
ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')
]
protected ?Course $course;
我被逻辑错误震惊了 * 执行查询时出现异常:数据库状态[23000]:完整性约束冲突:1048数据行'student_id'不能为空值 *
我想指定我使用EasyAdmin 4.0来实现这一点。在StudentCrudController中,我的grades属性如下所示:
CollectionField::new('grades')
->setEntryType(GradeType::class)
->setEntryIsComplex(),
1条答案
按热度按时间j91ykkif1#
从
Grade::course
中删除cascade
参数,因为如果删除年级,则属于该年级的课程和年级也将被删除也可以将
orphanRemove = true
添加到Student::grades