Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ORM条令更新级联多通(Symfony)_Php_Symfony_Orm_Doctrine Orm - Fatal编程技术网

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;