Doctrine 2 cascade={''remove"} doesn't

2019-02-05 01:04发布

Hi I have the following class

/**
 * 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;

With the following relationship

/**
 * 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;
}

Does anybody know why when the customer gets deleted the addresses aren't? Many thanks

2条回答
唯我独甜
2楼-- · 2019-02-05 01:26

I had quite a bit of trouble getting this to work. Here's some points that might help those having similar troubles:

  1. The owning entity needs @OneToMany( ... cascade={"remove"} or cascade={"all"} )
  2. The child entity also needs @JoinColumn(... onDelete="CASCADE")
  3. Also, if you are modifying the onDelete="CASCADE" part I believe you will need to update your schema before your changes take effect.
查看更多
神经病院院长
3楼-- · 2019-02-05 01:33

Your relationship definition seems to be fine. What is the way the customer is deleted? I mean Doctrine doesn't set "ON DELETE CASCADE" directly in database. So, if you remove customer entity in other way than "doctrine's" one, comments won't be deleted.

You may tell doctrine to set this directly in database, by adding in annotation:

@ORM\JoinColumn(name="icustomer_id", referencedColumnName="icustomer_id", onDelete="CASCADE")

But if you're trying remove the entity in right-doctrine way ant this still doesn't work, try add "orphanRemoval" to true, it should help:

// Customer.php
/**
 * @var string $addresses
 * @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"}, orphanRemoval=true)
 */
protected $addresses;
查看更多
登录 后发表回答