Php ORM条令更新级联多通(Symfony)
我有两个实体Php ORM条令更新级联多通(Symfony),php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,我有两个实体 class Promotor { /** * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor") * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) */ protected $ciudad; 及 “推广人”可以住在一个“城市”。而在一个“城市”(Ciudad),可以住很多“推广者” 如果我在列中添
class Promotor
{
/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor")
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false)
*/
protected $ciudad;
及
“推广人”可以住在一个“城市”。而在一个“城市”(Ciudad),可以住很多“推广者”
如果我在列中添加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
但我也喜欢在更新时进行级联。我尝试使用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”用于数据库级别。正如你已经说过的,没有更新。另一个缺点是ON DELETE CASCADE只能在InnoDB上工作。它对MyISAM不起作用
但您可以在内存级联操作中使用原则:
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;
我在条令文件中找到了这张纸条,但我不明白。更新时不再需要控制级联。理论上它永远不会改变ID顺便说一句,如果
ciudad
实体没有字段$promotor
,那么$ciudad
属性上怎么会有inversedBy=“promotor”
?(甚至从MTO关系的性质来看,它根本不能有对发起人
的“反向”引用)?你是对的,Ciudad
实体上没有发起人
属性。所以不可能有inversedBy=“promotor”
。但是关于多通关系和逆
引用,您是错的。很多人都有inverse
,还有很多人都有mappedBy
。对不起,我的措辞不够精确。当我说“反向”时,我实际上是指相同的反向。另外,尽管您所说的似乎合乎逻辑(不可能有inversedBy=“promotor”
),但我在文档中查找了@manytone
,其中提到了这个inversedBy
参数(尽管不是强制性的)。但我仍然感到困惑——为什么MTO关系会被
逆转?是不是真的,可能有inversedBy
这将是许多关系?我想我已经弄明白了:根据文档inversedBy属性指定实体中的字段,即关系的反面。
关键字是实体中的字段
-它是其他实体中的字段(但在数据库中的另一个实体表示中,不会为该关系添加额外的字段)。并且它仍然是MTO到OTM的关系。
class Promotor
{
/**
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"})
*/
protected $ciudad;