Я работаю над проектом, где я вынужден использовать каскад = { «удалить», «сохраняются»} из-за 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 для удаления объекта до его сохранения, если запись существует в базе данных. Но мне интересно, должен ли он быть таким сложным?
Спасибо за вашу помощь заранее.
Я обновил свой вопрос, посмотрю .. если вы можете мне помочь. Я думаю, что мне нужно обновлять модель передачи, поскольку сотрудник может быть уже существующим. – Gaurav