9

私は2つのエンティティを持っています

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;

「プロモーター」は、1 つの「シウダード」(都市)に住むことができます。そして、「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 が存在しないことがわかりましたが..更新時にカスケードする方法はありますか?

4

1 に答える 1

12

onDelete="CASCADE" はデータベース レベルで使用されます。あなたがすでに言ったように、onUpdateはありません。もう 1 つの欠点は、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;

すべてドキュメントに記載されています: https://www.doctrine-project.org/projects/doctrine-orm/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;
于 2013-04-25T11:11:19.623 に答える