2013-04-24 23 views
8

Tôi có hai thực thểORM thuyết ManyToOne vào cập nhật CASCADE (Symfony)

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; 

A "Promotor" có thể sống trong một "Ciudad" (City). Và trong một "Ciudad" (Thành phố) có thể sống nhiều "Promotores".

Nếu tôi thêm onDelete = "CASCADE" trong JoinColumn

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

nó tạo mã tiếp theo

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 

mà còn tôi thích làm CASCADE vào cập nhật. Tôi thử với onUpdate = "CASCADE" nhưng nó doesn' công việc

[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 

By lỗi Tôi hiểu rằng tài sản onUpdate không tồn tại, nhưng .. Có cách nào để làm thác trên bản cập nhật?

+1

tôi thấy ghi chú này trong tài liệu của học thuyết, nhưng tôi không hiểu. Nó không còn cần thiết để kiểm soát các tầng trên cập nhật. Về lý thuyết, nó sẽ không bao giờ thay đổi các id http://www.doctrine-project.org/jira/browse/DDC-725?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel – JGrinon

Trả lời

9

OnDelete = "CASCADE" được sử dụng ở cấp cơ sở dữ liệu. Như bạn đã nói không có onUpdate. Một nhược điểm khác là ON DELETE CASCADE chỉ hoạt động trên InnoDB. Nó không hoạt động trên MyISAM.

Nhưng bạn có thể sử dụng Doctrine trong bộ nhớ hoạt động cascade:

class Promotor 
{ 

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(name="ciudad_id", referencedColumnName="id", nullable=false) 
*/ 
protected $ciudad; 

Đó là tất cả được mô tả trong tài liệu hướng dẫn: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

Thêm vào đó bạn có thể bỏ qua JoinColumn chú thích, bởi vì cách bạn có nó được viết, là cấu hình mặc định và được tạo ra ngầm.

Vì vậy, bạn chỉ có thể viết:

class Promotor 
{ 

/** 
* @ORM\ManyToOne(targetEntity="Ciudad", inversedBy="promotor", cascade={"persist", "remove"}) 
*/ 
protected $ciudad; 
+0

BTW, làm thế nào đến có 'inversedBy =" promotor "' trên thuộc tính '$ ciudad', nếu thực thể' Ciudad' KHÔNG có trường '$ promotor'? (Và thậm chí từ bản chất của các mối quan hệ MTO, nó KHÔNG THỂ có tham chiếu 'nghịch đảo' với 'Promotor' ở tất cả)? –

+0

Bạn nói đúng, không có thuộc tính 'promotor' trên thực thể' Ciudad'. Vì vậy, không thể có 'inversedBy =" promotor "'. Nhưng bạn sai về mối quan hệ ManyToOne và tham chiếu 'nghịch đảo'. ManyToOne có 'nghịch đảo' và OneToMany có' mappedBy'. – alsar

+0

Xin lỗi, từ ngữ của tôi không đủ chính xác. Khi tôi nói 'nghịch đảo' tôi thực sự có nghĩa là cùng một 'nghịch đảoBy'. Mặc dù nó có vẻ hợp lý những gì bạn đã nói (rằng không thể có 'inversedBy =" promotor "') Tôi tìm kiếm các tài liệu cho '@ ManyToOne' http://doctrine-orm.readthedocs.org/en/latest /reference/annotations-reference.html#annref-manytoone và nó đề cập đến tham số 'inversedBy' này (mặc dù không bắt buộc). Nhưng tôi vẫn còn bối rối như thế nào - làm thế nào đến một mối quan hệ MTO có thể có 'inversedBy'? Có đúng là, có lẽ đã có 'inversedBy' sẽ là mối quan hệ ManyToMany? –

Các vấn đề liên quan