【问题标题】:Doctrine 2 ORM Cascading remove related entitiesDoctrine 2 ORM 级联删除相关实体
【发布时间】:2015-11-07 07:37:51
【问题描述】:

我想检查我的语法对于级联删除以下实体是否正确,我希望当我删除主题或用户时,它会级联并删除与其相关的教师实体。

教师实体

class Teacher{

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     **/
    protected $id;

    /** @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="Subject")
     * @ORM\JoinColumn(name="subjectId", referencedColumnName="id",  onDelete="CASCADE")
     *  */
    protected $subjectId;

    /** @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="userId", referencedColumnName="id",  onDelete="CASCADE")
     *  */
    protected $userId;

}

主题实体

/** @ORM\Entity */
class Subject{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /** @ORM\Column(type="integer") */
    protected $sectionId;

    /** @ORM\Column(type="string") */
    protected $subjectName;

用户实体

/** @ORM\Entity */
class User {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /** @ORM\Column(type="string") */
    protected $username;

    /** @ORM\Column(type="string") */
    protected $password;

    /** @ORM\Column(type="string") */
    protected $first_name;

    /** @ORM\Column(type="string") */
    protected $middle_name;

    /** @ORM\Column(type="string") */
    protected $last_name;

    /** @ORM\Column(type="string") */
    protected $sex;

    /** @ORM\Column(type="date") */
    protected $dob;

    /** @ORM\Column(type="boolean") */
    protected $is_active;

    /** @ORM\Column(type="boolean") */
    protected $is_admin;

    /** @ORM\Column(type="string") */
    protected $email;

    /** @ORM\Column(type="string") */
    protected $address;

    /** @ORM\Column(type="string") */
    protected $bloodTypeId;

    /** @ORM\Column(type="string") */
    protected $photo;

    /** @ORM\Column(type="integer") */
    protected $userTypeId;

因为当我删除用户或主题时它似乎不起作用,我希望与他们的领域相关的老师也被删除。

【问题讨论】:

  • 结帐this answer。您正在使用 @joinColumn 中的数据库级级联,而不是使用 cascade={"remove"} 进行 ORM 级别的删除。如果您确实想要 DB 级级联,那么您还需要运行 create/update schema cli 工具,以便将它们添加到 DB。

标签: orm doctrine-orm zend-framework2


【解决方案1】:

如果您在堆栈上搜索overlflow,您的答案已经是 here

Doctrine 中有两种级联:

1) ORM 级别 - 在关联中使用 cascade={"remove"} - 这是在 UnitOfWork 中完成的计算,不会影响数据库结构。当您移除一个对象时,UnitOfWork 将遍历关联中的所有对象并移除它们。

2) 数据库级别 - 在关联的 joinColumn 上使用 onDelete="CASCADE" - 这会将 On Delete Cascade 添加到数据库中的外键列:


您的onDelete="CASCADE" 主题和教师内的用户将有以下结果:当您删除教师时,该操作将级联到主题和用户(因此它们也被删除)。我认为这不是你想要的......

【讨论】:

    【解决方案2】:

    不,我想在删除用户时删除老师,当我删除主题时也删除老师

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2014-09-30
      • 2013-03-23
      • 2015-06-22
      • 2013-11-05
      • 2018-08-28
      相关资源
      最近更新 更多