2011-12-30 42 views
27

Tôi có một bảng tham gia được tạo bằng cách sử dụng chú thích @ORM\ManyToMany trong Symfony2/Doctrine. Nó tham gia CategoryParameter bảng.Làm thế nào để xóa các hàng khỏi bảng nối (ManyToMany) trong Doctrine?

Bây giờ tôi muốn xóa tất cả các tham số khỏi bảng Tham số. Bởi vì có những ràng buộc khóa ngoài được xác định trên bảng kết nối, tôi không thể chỉ xóa các hàng khỏi bảng Tham số. Trước tiên, tôi phải xóa các hàng con khỏi bảng tham gia. Tuy nhiên, cú pháp DQL của Dotrine yêu cầu cung cấp tên của thực thể, như:

DELETE Project\Entity\EntityName 

Nhưng tên của thực thể kết hợp được tạo ra bằng cách sử dụng tổ hợp ManyToMany là gì? Làm thế nào để đối phó với nó?

Cách khác, làm cách nào tôi có thể đặt CẬP NHẬT CÂU HỎI THƯỜNG GẶP và TRÊN DELETE CASCADE trên các ràng buộc khóa ngoài trong bảng nối được xác định bởi chú thích @ORM\ManyToMany.

EDIT:

schema tham gia bàn:

CREATE TABLE `categories_params` (
    `category_id` INT(11) NOT NULL, 
    `param_id` INT(11) NOT NULL, 
    PRIMARY KEY (`category_id`, `param_id`), 
    INDEX `IDX_87A730CB12469DE2` (`category_id`), 
    INDEX `IDX_87A730CB5647C863` (`param_id`), 
    CONSTRAINT `categories_params_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `allegro_category` (`id`), 
    CONSTRAINT `categories_params_ibfk_2` FOREIGN KEY (`param_id`) REFERENCES `category_param` (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB; 

on UPDATEon DELETE theo mặc định được thiết lập để RESTRICT

giải pháp cuối cùng sẽ là:

* @ORM\ManyToMany(targetEntity="CategoryParam", cascade={"persist","remove"}) 
* @ORM\JoinTable(name="categories_params", 
*  joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="param_id", referencedColumnName="id", onDelete="CASCADE")}) 
+0

Bạn có thể đăng các schema bảng? Tôi nghi ngờ bạn có một ràng buộc FK trên bảng kết nối để loại bỏ các hàng nếu bất kỳ hàng nào bị xóa khỏi bảng Danh mục hoặc Tham số. Nếu đây là trường hợp, tất cả những gì bạn phải làm là xóa khỏi bảng Tham số và MySQL sẽ xử lý phần còn lại cho bạn. –

+0

Thực ra ràng buộc FK trong bảng nối của tôi ngăn chặn xóa các hàng khỏi bảng cha (Tham số) nếu chúng được tham chiếu bởi bảng nối. Tôi có thể thay đổi ràng buộc này trong lược đồ db, nhưng tôi muốn làm điều đó bằng cách sử dụng chú thích của Doctrine (để có thể tạo ra lược đồ đầy đủ từ mã mà không cần chỉnh sửa cơ sở dữ liệu theo cách thủ công). – JohnM2

+0

Bạn có nhớ đăng lược đồ không? Tôi quan tâm để xem việc xử lý FK được thực hiện ở lớp ứng dụng thông qua Doctrine hay Doctrine chỉ trừu tượng hóa những gì MySQL đã làm. –

Trả lời

28

Để thiết thác vào trình độ học thuyết:

@ORM\ManyToMany(targetEntity="Target", inversedBy="inverse", cascade={"remove", "persist"}) 

Thông tin thêm: Doctrine2 Annotation Reference.

Để thiết thác trên mức mysql:

@ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE") 
+0

Chỉ cần tò mò, nhưng không thể anh ta chỉ cần xóa các hàng từ bảng tham số, và với FK để tham gia bảng, các hàng tham gia cũng sẽ bị xóa? Tôi chưa được đào sâu vào D2, nhưng có vẻ như không cần thiết cho ORM để làm những gì cơ sở dữ liệu không tự nhiên. –

+2

@Inori cascade = {"remove", "persist"} không ảnh hưởng đến lược đồ cơ sở dữ liệu, nó đi vào hoạt động khi bạn loại bỏ các thực thể bằng EntityManager. – JohnM2

+0

@Digital Precision theo ràng buộc FK mặc định không cho phép xóa các hàng khỏi bảng cha (Tham số) nếu chúng được tham chiếu bởi bảng nối. Đó là lý do tại sao tôi hỏi làm thế nào tôi có thể thay đổi hạn chế này để cascade xóa. – JohnM2

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