2011-12-02 55 views
5

Tôi có hai thực thể với một mối quan hệ một chiều one-to-one:thuyết 2 One-To-One mối quan hệ một chiều xóa không sở hữu bên

class Foo { 
... 
/** 
* @OneToOne(targetEntity="Bar") 
*/ 
private $bar; 
... 
} 

class Bar { 
... 
} 

Khi tôi cố gắng xóa một thực thể Bar Tôi nhận được lỗi này :

Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails

Làm cách nào để giữ mối quan hệ một chiều mà không mất khả năng xóa các thực thể Bar?

Trả lời

5

Với Doctrine 2, đây là những gì bạn cần làm:

class Foo { 
    ... 
    /** 
    * @OneToOne(targetEntity="Bar") 
    * @JoinColumn(name="bar_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    private $bar; 
    ... 
} 

class Bar { 
    ... 
} 

Các onDelete = "Cascade" sẽ làm những gì Cappy nói trong câu trả lời của mình (thiết lập chính nước ngoài của bạn trên cascade delete). Bằng cách này, khi bạn xóa thực thể Bar của mình, thực thể Foo được liên kết cũng sẽ bị xóa.

Trong trường hợp bạn không muốn loại bỏ thực thể Foo của mình, bạn chỉ cần thay thế onDelete = "Cascade" bằng onDelete = "SET NULL".

2

Bạn có thể sử dụng Orphan Removal. Nó hoạt động với các liên kết one-to-one, one-to-manymany-to-many.

Bạn phải chỉ để thêm tùy chọn orphanRemoval=true như thế này:

@OneToOne(targetEntity="Bar", orphanRemoval=true) 

Hy vọng điều này có thể giúp ai đó.

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