更新CASCADE(Symfony)上的ORM Doctrine ManyToOne

JGr*_*non 9 php orm symfony doctrine-orm

我有两个实体

class Promotor
{

/**
 * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor")
 * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false)
 */
protected $ciudad;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

"推广者"可以住在一个"城市"(Ciudad).而在"Ciudad"(城市)可以住许多"促销员".

如果我在JoinColumn中添加onDelete ="CASCADE"

/**
 * @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor")
 * @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
 */
protected $ciudad;
Run Code Online (Sandbox Code Playgroud)

它生成下一个代码

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
Run Code Online (Sandbox Code Playgroud)

但我也喜欢在更新时做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
Run Code Online (Sandbox Code Playgroud)

通过错误,我理解onUpdate属性不存在,但..有没有办法在更新时进行级联?

小智 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;
Run Code Online (Sandbox Code Playgroud)

这些都在文档中描述: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;
Run Code Online (Sandbox Code Playgroud)

  • 我想我已经弄明白了:根据文档`inversedBy属性指定实体中的字段是关系的反面.关键字是`实体中的字段` - 它是其他实体中的字段(但是在数据库中的其他实体表示中,不会为该关系添加额外的字段).它仍然是MTO与OTM的关系. (2认同)