我有两个实体
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;
“推广者”可以住在一个“城市”(Ciudad)。而在“Ciudad”(城市)可以住许多“促销员”。
如果我在JoinColumn
中添加onDelete =“CASCADE”/**
* @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属性不存在,但是..有没有办法在更新时进行级联?
答案 0 :(得分:12)
onDelete =“CASCADE”用于数据库级别。正如您已经说过的那样,没有onUpdate。另一个缺点是ON DELETE CASCADE仅适用于InnoDB。它不适用于MyISAM。
但是你可以使用Doctrine内存级联操作:
class Promotor
{
/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false)
*/
protected $ciudad;
另外,您可以跳过 JoinColumn 注释,因为您编写它的方式是默认配置,并且它是隐式生成的。
所以你可以写:
class Promotor
{
/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"})
*/
protected $ciudad;