Doctrine orm 多目标原则:移除一个对象

Doctrine orm 多目标原则:移除一个对象,doctrine-orm,many-to-many,Doctrine Orm,Many To Many,我对教义中的单向多人关系有问题。情况很简单:产品有很多标签。标签可以附加到产品上,也可以附加到模型中的任何“可标记”实体上。以下是我的代码片段: /** * @Entity * @Table(name="products") **/ class Product { /** some other fields here */ /** * @ManyToMany(targetEntity="Tag") * @JoinTable(name="produc

我对教义中的单向多人关系有问题。情况很简单:产品有很多标签。标签可以附加到产品上,也可以附加到模型中的任何“可标记”实体上。以下是我的代码片段:

/**
 * @Entity 
 * @Table(name="products")
 **/
class Product {

    /** some other fields here */

    /**
     * @ManyToMany(targetEntity="Tag")
     * @JoinTable(name="products_tags",
     *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="id")}     
     *      )
     */
    protected $tags;

}
由于省略了标记类的单向关系码

对于此类定义的关联原则,生成以下SQL代码(跳过产品表和标签表的SQL):

我想删除带有一些标签的产品

/* $product is already persisted, $em is an Entity Manager */
$em->remove($product);
$em->flush();
它显然由于完整性约束冲突而失败(“无法删除或更新父行:外键约束失败(
products\u tags
,constraint
FK\u E3AB5A2CBAD26311
外键(
tag\u id
)引用
标记(
id
)”)

当我改变products_tags表并将DELETE CASCADE添加到外键时,它可以按照我的需要工作。我可以很容易地删除标签($em->remove($TAG))和产品($em->remove($PRODUCT),它们会自动从products\u tags表中删除引用的行

我的代码应该是如何获得带有ON CASCADE DELETE外键的products_tags表的?我已经厌倦了CASCADE={“all”},但它失败了

我知道,我可以从产品的标签集合中删除所有标签,但正如我所提到的,我希望通过调用entity manager对象的remove方法一步完成


Doctrine真的缺少这些吗?

好的,我通过挖掘Doctrine2文档来管理自己;)解决方案是将onDelete=“cascade”添加到@JoinColumn

/**
 * @Entity 
 * @Table(name="products")
 **/
class Product {

    /** some other fileds here */

    /**
     * @ManyToMany(targetEntity="Tag")
     * @JoinTable(name="products_tags",
     *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id", onDelete="cascade")},
     *      inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade")}     
     *      )
     */
    protected $tags;

}

请注意,cascade={“all”}是在对象级别(在您的应用程序中)管理的,而onDelete=“cascade”是在数据库级别。

对我来说,这不会导致任何更新的模式,因此不会导致级联行为。我使用单向的manytomy。有什么想法吗?我自己刚试过,效果不错。如果您以前没有定义,这个添加应该会导致模式更改。通常,条令的缓存是个问题。尝试运行
php-bin/console原则:缓存:清除元数据
,然后运行
php-bin/console原则:迁移:diff
。希望这将生成一个更新的迁移文件。
/**
 * @Entity 
 * @Table(name="products")
 **/
class Product {

    /** some other fileds here */

    /**
     * @ManyToMany(targetEntity="Tag")
     * @JoinTable(name="products_tags",
     *      joinColumns={@JoinColumn(name="product_id", referencedColumnName="id", onDelete="cascade")},
     *      inverseJoinColumns={@JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade")}     
     *      )
     */
    protected $tags;

}