2016-07-28 14 views
1

Я работаю над проектом, где я вынужден использовать каскад = { «удалить», «сохраняются»} из-за problem described here.Как удалить использование cascade = {"remove", "persist"} из объектов в Symfony2?

Чтение через documentation, процитировать:

Несмотря на то, автоматический каскадный режим удобно использовать с осторожностью. Не слепо применять cascade = all для всех ассоциаций, поскольку это излишне ухудшает производительность вашего приложения. Для каждой активируемой каскадной операции Doctrine также применяет эту операцию к ассоциации, будь она одиночной или коллекционной.

И я вижу, что то же самое может быть исправлено, если я использую

$em->persist($entity); 

В моей настойчивости услуг, которые я уже призывающих. Однако доктрина не работает должным образом. Вот мои сущности.

Entity/Employee.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping AS ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(
*    name="UNIQ_EMPLOYEE_ID_NAME_ADDRESS_STATE_CITY_COUNTRY", 
*    columns={"id","name","city","state","country"} 
*  )}) 
*/ 
class Employee 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", options={"unsigned":true}) 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $name; 

    /** 
    * @ORM\Column(type="text", nullable=false) 
    */ 
    private $address; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $city; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $state; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $country; 


    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Department", inversedBy="employee", cascade={"remove","persist"}) 
    * @ORM\JoinColumn(name="department_id", referencedColumnName="id", nullable=false) 
    */ 
    private $department; 

    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Transfer", mappedBy="employee", cascade={"remove","persist"}) 
    */ 
    private $transfer; 
} 

?> 

Entity/Department.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping AS ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\Common\Collections\Selectable; 

/** 
* @ORM\Entity 
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(
*    name="UNIQ_DEPARTMENT_ID_NAME", 
*    columns={"id","name"} 
*  )}) 
*/ 
class Department 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", options={"unsigned":true}) 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Employee", mappedBy="department", cascade={"remove","persist"}) 
    */ 
    private $employee; 

    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Transfer", mappedBy="department", cascade={"remove","persist"}) 
    */ 
    private $transfer; 
} 

?> 

Entity/Transfer.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping AS ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\Common\Collections\Selectable; 

/** 
* @ORM\Entity 
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(
*    name="UNIQ_TRANSFER_ID_DEPARTMENT_EMPLOYEE_START_END", 
*    columns={"id","name"} 
*  )}) 
*/ 
class Transfer 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", options={"unsigned":true}) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="date", length=255, nullable=false) 
    */ 
    private $start; 

    /** 
    * @ORM\Column(type="date", length=255, nullable=false) 
    */ 
    private $end; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Employee", inversedBy="attendance", cascade={"persist","remove"}) 
    * @ORM\JoinColumn(name="employee_id", referencedColumnName="id", nullable=false) 
    */ 
    private $employee; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Department", inversedBy="attendance", cascade={"persist","remove"}) 
    * @ORM\JoinColumn(name="department_id", referencedColumnName="id", nullable=false) 
    */ 
    private $department; 
} 

?> 

ОБНОВЛЕНИЕ 1:

Теперь у меня есть еще одна проблема. Поскольку моя стратегия GeneratorValue для Employee and Department NONE, у меня есть проблема с двойной ошибкой записи. Я пытаюсь использовать PreFlushEventArgs для удаления объекта до его сохранения, если запись существует в базе данных. Но мне интересно, должен ли он быть таким сложным?

Спасибо за вашу помощь заранее.

ответ

2

Кажется, что вы используете каскад от Employee to Department и Transfer. Но они также каскадируют операцию persist на Employee Entity.

Это означает, что когда вы делаете

$em->persist($an_employee); 

Вы застряли в цикле сохраняются.

По моему мнению, сохранение каскада должно быть только одним способом, то есть только на сущности Employee.

Кроме того, если вы решите сделать это, добавьте ваш отдел Работника, а не наоборот:

$an_employee->addDepartment($a_department); 
$an_employee->addTransfer($a_transfer); 

Таким образом, когда вы будете упорствовать работник, его отделы и передача должны быть сохранялись слишком

+0

Я обновил свой вопрос, посмотрю .. если вы можете мне помочь. Я думаю, что мне нужно обновлять модель передачи, поскольку сотрудник может быть уже существующим. – Gaurav