在删除带有doctrine2的级联时

如何解决在删除带有doctrine2的级联时

| 我正在尝试举一个简单的示例,以学习如何从父表中删除行并使用Doctrine2自动删除子表中的匹配行。 这是我正在使用的两个实体: Child.PHP
<?PHP

namespace Acme\\CascadeBundle\\Entity;

use Doctrine\\ORM\\Mapping as ORM;

/**
 * @ORM\\Entity
 * @ORM\\Table(name=\"child\")
 */
class Child {

    /**
     * @ORM\\Id
     * @ORM\\Column(type=\"integer\")
     * @ORM\\GeneratedValue(strategy=\"AUTO\")
     */
    private $id;
    /**
     * @ORM\\ManyToOne(targetEntity=\"Father\",cascade={\"remove\"})
     *
     * @ORM\\JoinColumns({
     *   @ORM\\JoinColumn(name=\"father_id\",referencedColumnName=\"id\")
     * })
     *
     * @var father
     */
    private $father;
}
父亲.PHP
<?PHP
namespace Acme\\CascadeBundle\\Entity;

use Doctrine\\ORM\\Mapping as ORM;

/**
 * @ORM\\Entity
 * @ORM\\Table(name=\"father\")
 */
class Father
{
    /**
     * @ORM\\Id
     * @ORM\\Column(type=\"integer\")
     * @ORM\\GeneratedValue(strategy=\"AUTO\")
     */
    private $id;
}
数据库上正确创建了表,但是未创建“在删除级联”选项上。我究竟做错了什么?     

解决方法

        在教义中有两种级联: 1)ORM级别-在关联中使用
cascade={\"remove\"}
-这是在UnitOfWork中完成的计算,不影响数据库结构。删除对象时,UnitOfWork将遍历关联中的所有对象并将其删除。 2)数据库级别-在关联的joinColumn上使用
onDelete=\"CASCADE\"
-将在Delete Cascade上添加到数据库的外键列中:
@ORM\\JoinColumn(name=\"father_id\",referencedColumnName=\"id\",onDelete=\"CASCADE\")
我还要指出的是,您现在具有层叠= {\“删除\”}的方式,如果删除Child对象,则此层叠将删除Parent对象。显然不是您想要的。     ,        这是简单的例子。联系人具有一对多关联的电话号码。删除联系人后,我想要所有与其关联的电话号码 也要删除,所以我使用了DE DELETE CASCADE。一对多/多对一关系是通过phone_numbers中的外键实现的。
CREATE TABLE contacts
 (contact_id BIGINT AUTO_INCREMENT NOT NULL,name VARCHAR(75) NOT NULL,PRIMARY KEY(contact_id)) ENGINE = InnoDB;

CREATE TABLE phone_numbers
 (phone_id BIGINT AUTO_INCREMENT NOT NULL,phone_number CHAR(10) NOT NULL,contact_id BIGINT NOT NULL,PRIMARY KEY(phone_id),UNIQUE(phone_number)) ENGINE = InnoDB;

ALTER TABLE phone_numbers ADD FOREIGN KEY (contact_id) REFERENCES \\
contacts(contact_id) ) ON DELETE CASCADE;
通过在外键约束中添加\“ ON DELETE CASCADE \”,当与他们关联的联系人为 已删除。
INSERT INTO table contacts(name) VALUES(\'Robert Smith\');
INSERT INTO table phone_numbers(phone_number,contact_id) VALUES(\'8963333333\',1);
INSERT INTO table phone_numbers(phone_number,contact_id) VALUES(\'8964444444\',1);
现在,当删除联系人表中的一行时,其所有关联的phone_numbers行将被自动删除。
DELETE TABLE contacts as c WHERE c.id=1; /* delete cascades to phone_numbers */
要在Doctrine中实现相同的目的,要获得相同的数据库级“ ON DELETE CASCADE”行为,请使用以下命令配置@JoinColumn: onDelete = \“ CASCADE \”选项。
<?php
namespace Entities;

use Doctrine\\Common\\Collections\\ArrayCollection;

/**
 * @Entity
 * @Table(name=\"contacts\")
 */
class Contact 
{

    /**
     *  @Id
     *  @Column(type=\"integer\",name=\"contact_id\") 
     *  @GeneratedValue
     */
    protected $id;  

    /** 
     * @Column(type=\"string\",length=\"75\",unique=\"true\") 
     */ 
    protected $name; 

    /** 
     * @OneToMany(targetEntity=\"Phonenumber\",mappedBy=\"contact\")
     */ 
    protected $phonenumbers; 

    public function __construct($name=null)
    {
        $this->phonenumbers = new ArrayCollection();

        if (!is_null($name)) {

            $this->name = $name;
        }
    }

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function addPhonenumber(Phonenumber $p)
    {
        if (!$this->phonenumbers->contains($p)) {

            $this->phonenumbers[] = $p;
            $p->setContact($this);
        }
    }

    public function removePhonenumber(Phonenumber $p)
    {
        $this->phonenumbers->remove($p);
    }
}

<?php
namespace Entities;

/**
 * @Entity
 * @Table(name=\"phonenumbers\")
 */
class Phonenumber 
{

    /**
    * @Id
    * @Column(type=\"integer\",name=\"phone_id\") 
    * @GeneratedValue
    */
    protected $id; 

    /**
     * @Column(type=\"string\",length=\"10\",unique=\"true\") 
     */  
    protected $number;

    /** 
     * @ManyToOne(targetEntity=\"Contact\",inversedBy=\"phonenumbers\")
     * @JoinColumn(name=\"contact_id\",referencedColumnName=\"contact_id\",onDelete=\"CASCADE\")
     */ 
    protected $contact; 

    public function __construct($number=null)
    {
        if (!is_null($number)) {

            $this->number = $number;
        }
    }

    public function setPhonenumber($number)
    {
        $this->number = $number;
    }

    public function setContact(Contact $c)
    {
        $this->contact = $c;
    }
} 
?>

<?php

$em = \\Doctrine\\ORM\\EntityManager::create($connectionOptions,$config);

$contact = new Contact(\"John Doe\"); 

$phone1 = new Phonenumber(\"8173333333\");
$phone2 = new Phonenumber(\"8174444444\");
$em->persist($phone1);
$em->persist($phone2);
$contact->addPhonenumber($phone1); 
$contact->addPhonenumber($phone2); 

$em->persist($contact);
try {

    $em->flush();
} catch(Exception $e) {

    $m = $e->getMessage();
    echo $m . \"<br />\\n\";
}
如果你现在做
# doctrine orm:schema-tool:create --dump-sql
您将看到将生成与第一个原始SQL示例相同的SQL     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?