16

こんにちは私は次のクラスを持っています

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;

次の関係で

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

顧客が削除されたときにアドレスが削除されない理由を誰かが知っていますか?どうもありがとう

4

3 に答える 3

43

あなたの関係の定義は問題ないようです。顧客が削除される方法は何ですか?Doctrineがデータベースに直接「ONDELETECASCADE」を設定していないことを意味します。したがって、「doctrine」以外の方法で顧客エンティティを削除しても、コメントは削除されません。

注釈を追加することで、これをデータベースに直接設定するようにdoctrineに指示できます。

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

しかし、正しい方法でエンティティを削除しようとしていて、これがまだ機能しない場合は、trueに「orphanRemoval」を追加してみてください。これは役立つはずです。

// Customer.php
/**
 * @var string $addresses
 * @ORM\OneToMany(targetEntity="MP\User\RegistrationBundle\Entity\Address", mappedBy="customer", cascade={"remove"}, orphanRemoval=true)
 */
protected $addresses;
于 2012-10-16T09:37:14.657 に答える
12

これを機能させるのにかなり苦労しました。同様の問題を抱えている人を助けるかもしれないいくつかのポイントがあります:

  1. 所有するエンティティは@OneToMany( ... cascade={"remove"}、またはcascade={"all"} )
  2. 子エンティティも必要です@JoinColumn(... onDelete="CASCADE")
  3. また、onDelete="CASCADE"パーツを変更する場合は、変更を有効にする前にスキーマを更新する必要があると思います。
于 2015-03-10T23:32:58.847 に答える
0

上記の答えを試しましたが、同じ外部キー制約違反が発生しました。

私のコードは次のようなものでした:

class FooBar
{
    /**
     * @ORM\OneToMany(
     *     targetEntity="Foo",
     *     mappedBy="foobar",
     *     cascade={"persist", "remove"},
     *     orphanRemoval=true
     * )
     * @var Collection|Foo[]
     */
    private $fooCollection;

    /**
     * @return Collection|Foo[]
     */
    public function getFooCollection()
    {
        return $this->fooCollection;
    }

    /**
     * @param Collection|Foo[] $fooCollection
     *
     * @return $this
     */
    public function setFooCollection($fooCollection): FooBar
    {
        $this->fooCollection = $fooCollection;
        return $this;
    }
}

class Foo
{
    // ... some more properties & ID here ....

    /**
     * @ORM\OneToMany(
     *     targetEntity="Bar",
     *     mappedBy="foo",
     *     cascade={"persist", "remove"},
     *     orphanRemoval=true
     * )
     * @var Collection|Bar[]
     */
    private $barCollection;

    /**
     * @ORM\ManyToOne(
     *     targetEntity="FooBar",
     *     inversedBy="fooCollection"
     * )
     * @ORM\JoinColumn(
     *     name="fooBarId",
     *     referencedColumnName="fooBarId",
     *     nullable=false
     * )
     * @var FooBar
     */
    private $fooBar;

    public function __construct()
    {
        $this->barCollection = new ArrayCollection();
    }

    /**
     * @return Bar[]|Collection
     */
    public function getBarCollection()
    {
        return $this->barCollection;
    }

    /**
     * @param Bar[]|Collection $barCollection
     *
     * @return $this
     */
    public function setBarCollection($barCollection): Foo
    {
        $this->barCollection = $barCollection;
        return $this;
    }

    /**
     * @return FooBar
     */
    public function getFooBar(): FooBar
    {
        return $this->fooBar;
    }

    /**
     * @param FooBar $fooBar
     *
     * @return $this
     */
    public function setFooBar(FooBar $fooBar): Foo
    {
        $this->fooBar = $fooBar;
        return $this;
    }

    // ... some more getters & setters here ...
}

class Bar
{
    // ... some more properties & ID here ....

    /**
     * @ORM\ManyToOne(
     *     targetEntity="Foo",
     *     inversedBy="barCollection"
     * )
     * @ORM\JoinColumn(
     *     name="fooId",
     *     referencedColumnName="fooId",
     *     nullable=false
     * )
     * @var Foo
     */
    private $foo;

    // ... some more getters & setters here ...
}

プログラムの別の部分で、次のコードを使用して、FooBarに対応するすべてのFooを削除しようとしました。

$fooBar = new FooBar();
$fooBar->setFooCollection([]);

$entityManager->persist($foorBar);
$entityManager->flush();

これにより、FooとBarの関係で外部キー例外が発生しました。「親行を削除または更新できません。外部キー制約が失敗します」。

FooBarに次のメソッドを追加します。

/**
     * @param Foo[] $collection
     */
    public function removeFooCollection($collection)
    {
        /** @var Foo $entry */
        foreach ($collection as $entry)
        {
            $this->fooCollection->removeElement($entry);
            $entry->setFooBar(null);
        }
    }

そして、次のコードを使用して、FooBarに関連するすべてのFooを削除します。

$fooBar->removeFooCollection(
     $fooBar->getFooCollection()
);
$entityManager->persist($fooBar);
$entityManager->flush();

すべての外部キー制約の問題を修正しました。

于 2019-05-09T12:14:59.540 に答える