У меня есть два объекта
class Promotor { /** * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor") * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) */ protected $ciudad;
а также
class Ciudad { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="nombre", type="string", length=50) */ private $nombre;
«Промоутер» может жить в одной «Сьюдад» (Город). А в «Сьюдад» (Город) может жить много «Промоусов».
Если я добавлю onDelete = "CASCADE" в JoinColumn
/** * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor") * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false, onDelete="CASCADE") */ protected $ciudad;
он генерирует следующий код
ALTER TABLE promotor DROP FOREIGN KEY FK_BF20A37FE8608214; ALTER TABLE promotor ADD CONSTRAINT FK_BF20A37FE8608214 FOREIGN KEY (ciudad_id) REFERENCES Ciudad (id) ON DELETE CASCADE
но также мне нравится делать CASCADE при обновлении. Я пытаюсь использовать onUpdate = "CASCADE", но он не работает
[Doctrine\Common\Annotations\AnnotationException] [Creation Error] The annotation @ORM\JoinColumn declared on property Web\PromotorBundle\Entity\Promotor::$ciudad does not have a property named "onUpdate". Available properties: name, referencedColumnName, unique, nulla ble, onDelete, columnDefinition, fieldName
По ошибке я понимаю, что свойство onUpdate не существует, но .. Есть ли способ сделать каскад при обновлении?
OnDelete = "CASCADE" используется на уровне базы данных. Как вы уже сказали, нет onUpdate. Другим недостатком является то, что ON DELETE CASCADE работает только на InnoDB. Это не работает на MyISAM.
Но вы можете использовать каскадные операции Doctrine in-memory:
class Promotor { /** * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) */ protected $ciudad;
Все это описано в документации: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations
Кроме того, вы можете пропустить аннотацию JoinColumn , потому что так, как вы ее написали, это конфигурация по умолчанию, и она создается неявно.
Поэтому вы можете просто написать:
class Promotor { /** * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) */ protected $ciudad;