Symfony2:用于反向关系的ondelete级联

时间:2016-10-05 11:21:32

标签: php symfony

我有一个地址实体,用于各种其他实体,有用户有地址,有商店和公司。

现在我尝试做的是确保在删除商店时自动删除地址,所以我尝试了这个:

/**
 * Shop
 *
 * @ORM\Table(name="shop")
 * @ORM\Entity
 */
class Shop {
    /**
     * @ORM\OneToOne(targetEntity="Address",cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="address", referencedColumnName="id",nullable=true, onDelete="CASCADE")
     */
    private $address;

    ...
}

/**
 * Address
 *
 * @ORM\Table(name="address")
 * @ORM\Entity
 */
class Address {
    //... 
}

但这不符合我的要求,删除商店后地址仍然存在。我怎么能处理这个,有没有办法做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

您只需添加级联remove选项

/**
 * Shop
 *
 * @ORM\Table(name="shop")
 * @ORM\Entity
 */
class Shop {
    /**
     * @ORM\ManyToOne(targetEntity="Address", cascade={"persist, remove"})
     * @ORM\JoinColumn(name="address", referencedColumnName="id")
     */
    private $address;

    ...
}

onDelete="CASCADE"表示删除嵌入式实体时,也必须删除父实体。它是在数据库级别处理的。

cascade={"remove"}表示在删除父项时,必须删除嵌入式实体。它是在orm级别处理的。

请注意,您不需要在JoinColumn注释中指定nullable=true,true是默认值。

评论后更新

如果您的实体只有一个地址,那么您应该使用OneToOne关系。如果你想要一个参考Shop in Address那么你想要一个双向的,否则你将有一个单向的。

单向:

/**
 * Shop
 *
 * @ORM\Table(name="shop")
 * @ORM\Entity
 */
class Shop {
    /**
     * @ORM\OneToOne(targetEntity="Address", cascade={"persist, remove"})
     * @ORM\JoinColumn(name="address_id", referencedColumnName="id")
     */
    private $address;

    // ...
}

/**
 * Address
 *
 * @ORM\Table(name="address")
 * @ORM\Entity
 */
class Address {
    // ...
}

双向:

/**
 * Shop
 *
 * @ORM\Table(name="shop")
 * @ORM\Entity
 */
class Shop {
    /**
     * @ORM\OneToOne(targetEntity="Address", mappedBy="shop", cascade={"persist, remove"})
     */
    private $address;

    // ...
}

/**
 * Address
 *
 * @ORM\Table(name="address")
 * @ORM\Entity
 */
class Address {
    /**
     * @ORM\OneToOne(targetEntity="Shop", inversedBy="address")
     * @ORM\JoinColumn(name="shop_id", referencedColumnName="id")
     */
    private $shop;

    // Same for user / company
    // ...
}