2011-12-13 30 views
7

Tôi có một thực thể Công ty trong đó mỗi công ty có một công ty mẹ khác trong cấu trúc cây phân cấp.Symfony2, DoctrineFixturesBundle, không thể tải đồ đạc do ràng buộc khóa ngoài

Mọi thứ hoạt động tốt trong ứng dụng nên tôi chắc chắn các lớp Thực thể của tôi là chính xác.

Vấn đề là, nếu có đã nội dung trong cơ sở dữ liệu sau đó làm

doctrine:fixtures:load 

cho lỗi này:

[PDOException]                                                            
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails 

Im khá chắc chắn vấn đề là tải: đồ đạc phải cắt ngắn bảng, nhưng nó không thể mà không nhận được lỗi này.

Tôi không chắc chắn cách giải quyết vấn đề này mà không cần phải hack thứ gì đó vào Doctrine để vô hiệu hóa các ràng buộc chính trước khi thanh trừng. Không thực sự là một giải pháp lâu dài.

Các mối quan hệ khác trong cấu trúc dữ liệu không gây ra vấn đề vì học thuyết dường như thanh lọc theo đúng thứ tự để tránh các vấn đề, nhưng với bảng Công ty tự tham chiếu nó rơi xuống.

Heres thực thể của tôi.

class Company 
{ 
/** 
* @var integer $id 
* 
* @ORM\Id 
* @ORM\Column(name="id", type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @var string $name 
* @ORM\Column(type="string", length=100) 
*/  
protected $name; 

/** 
* @ORM\ManyToOne(targetEntity="Company", inversedBy="children") 
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
protected $parent; 

/* other properties here..... */ 

} 

Im sử dụng Symfony 2.0.7 và DEPS mới nhất, và MySQL 5,5

Trả lời

16

Tôi chỉ cần thiết để thiết lập đúng hành vi của onDelete.

Giá trị mặc định là RESTRICT, điều này giải thích lỗi được ném. Đặt nó rõ ràng để CASCADE hoặc SET NULL cho phép học thuyết làm trống bảng mà không có lỗi.

Trong trường hợp của tôi, tôi không muốn xóa một phụ huynh gây ra việc xóa các trẻ em, vì vậy tôi đã sử dụng SET NULL để các mối quan hệ sẽ bị xóa thay thế.

/** 
* @ORM\ManyToOne(targetEntity="Company", inversedBy="children") 
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="set null") 
*/ 
protected $parent; 
+0

Tôi có thông báo lỗi khác: * Số nhận dạng [...] bị thiếu cho truy vấn [...] \ Entity \ [...] *. Câu trả lời này là giải pháp, nó vẫn còn hợp lệ, ba năm sau (và với Symfony 2.3.25). Cảm ơn! –

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