Doctrine 2 cascade = {''remove"}似乎不起作用

Ric*_*ard 11 doctrine-orm

嗨,我有以下课程

/**
 * MP\User\RegistrationBundle\Entity
 */
namespace MP\User\RegistrationBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Persistence\PersistentObject;
use MP\Services\SiteAdapterBundle\Util\String;
/**
 * @ORM\Table(name="customer")
 * @ORM\Entity(repositoryClass="MP\User\RegistrationBundle\Repositories\CustomerRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Customer extends PersistentObject
{

    /**
     * @var string $id
     * @ORM\Id
     * @ORM\Column(name="icustomer_id", type="integer")
     */
    protected $id;

    /**
     * @var string $addresses
     * @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"})
     */
    protected $addresses;
Run Code Online (Sandbox Code Playgroud)

具有以下关系

/**
 * MP\User\RegistrationBundle\Entity
 */
namespace MP\User\RegistrationBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Persistence\PersistentObject;

/**
 * @ORM\Table(name="custdeladd") 
 * @ORM\Entity(repositoryClass="MP\User\RegistrationBundle\Repositories\AddressRepository")
 */
class Address extends PersistentObject
{
      /**
       * @var integer $suffix
       * @ORM\Column(name="isuffix", type="integer") 
       * @ORM\Id
       */
      protected $suffix;

      /**
       * @var object $customer
       * @ORM\ManyToOne(targetEntity="MP\User\RegistrationBundle\Entity\Customer", inversedBy="addresses", cascade={"persist"})
       * @ORM\JoinColumn(name="icustomer_id", referencedColumnName="icustomer_id")
       */
      protected $customer;
}
Run Code Online (Sandbox Code Playgroud)

有人知道为什么当客户被删除时地址不是吗?非常感谢

Cyp*_*ian 38

你的关系定义似乎很好.删除客户的方式是什么?我的意思是Doctrine没有直接在数据库中设置"ON DELETE CASCADE".因此,如果您以"学说"之外的其他方式删除客户实体,则不会删除注释.

您可以通过添加注释告诉doctrine直接在数据库中设置它:

@ORM\JoinColumn(name="icustomer_id", referencedColumnName="icustomer_id", onDelete="CASCADE")
Run Code Online (Sandbox Code Playgroud)

但是如果你试图以正确的教条方式删除实体,这仍然不起作用,尝试将"orphanRemoval"添加为true,它应该有所帮助:

// Customer.php
/**
 * @var string $addresses
 * @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"}, orphanRemoval=true)
 */
protected $addresses;
Run Code Online (Sandbox Code Playgroud)


Hen*_*nry 10

让这个工作起来我有点麻烦.以下是一些可能有助于遇到类似问题的观点:

  1. 拥有实体需要@OneToMany( ... cascade={"remove"}cascade={"all"} )
  2. 子实体也需要 @JoinColumn(... onDelete="CASCADE")
  3. 此外,如果您要修改onDelete="CASCADE"部件,我相信您需要在更改生效之前更新架构.

  • 那么为什么子实体还需要`onDelete="CASCADE"`?为什么它不能仅与 `cascade={"remove"}` 一起使用? (7认同)