删除属于2个实体Symfony的条目

pqwbnv8z  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(171)

从早上开始我就一直在尝试解决一个问题,但我无法解决。我正在做一个使用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(),
j91ykkif

j91ykkif1#

Grade::course中删除cascade参数,因为如果删除年级,则属于该年级的课程和年级也将被删除

class Student extends AbstractUser
{
    #[ORM\OneToMany(mappedBy: 'student', targetEntity: Grade::class, cascade: ['persist', 'remove'])]
    protected Collection $grades;
}

class Grade {
   #[
      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;
}

也可以将orphanRemove = true添加到Student::grades

相关问题