2013-05-27 31 views
7

Tôi nhận được một vi phạm ràng buộc nước ngoài khi cố xóa một thực thể, có chứa các liên kết một-nhiều-hướng một chiều. Tôi có lớp đơn giản sau đây:Doctrine2 - Không thể xóa một thực thể có quan hệ oneToMany đơn hướng

class Dealer{ 

/** 
* @ManyToMany(targetEntity="Car", cascade={"persist", "remove"}) 
* @JoinTable(name="dealer_cars", 
*  joinColumns={@JoinColumn(name="dealer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="car_id", referencedColumnName="id", 
     unique=true)} 
* ) 
**/ 
    protected cars; 
} 

Đối tượng Car không nên chứa một mối quan hệ với chủ sở hữu trong trường hợp này (vì thế mối quan hệ một chiều). Nếu tôi cố gắng xóa một đối tượng Dealer chứa các hiệp hội để xe, tôi nhận được vi phạm ràng buộc sau:

Cannot delete or update a parent row: a foreign key constraint fails 
(`application`.`dealer_cars`, CONSTRAINT `FK_E1BCEEEBC3C6F69F` 
FOREIGN KEY (`car_id`) REFERENCES `car` (`id`))' 

tôi sẽ nhận được thông báo tương tự nếu tôi đã cố gắng để xóa các hàng đại lý thủ công từ bảng cơ sở dữ liệu, nhưng tôi nghĩ Giáo lý, sử dụng cascade = "remove", sẽ giải quyết vấn đề này cho tôi.

Nếu tôi thay đổi liên kết thành liên kết hai chiều, nó hoạt động. Tại sao điều này không làm việc với các hiệp hội một chiều?

+0

một chiều one-to-many liên kết? điều này trông giống như hai hướng nhiều đối với tôi: D Bạn đã thả cơ sở dữ liệu của mình và tạo lại hay bạn có bất kỳ đồ đạc/dữ liệu dư thừa nào trong cơ sở dữ liệu khi bạn thay đổi lược đồ? – nifr

+0

bạn muốn xóa đại lý mà không bị mất xe, tôi có được quyền này không? – nifr

+1

Đó là định nghĩa của Doctrines về một chiều đối với một người. Nó là một nhiều - nhiều với một ràng buộc duy nhất. Tôi muốn xóa xe, khi đại lý cũng bị xóa. –

Trả lời

13

Sử dụng tùy chọn onDelete mức cơ sở dữ liệu với Học thuyết

@ORM\JoinColumn(name="dealer_id", referencedColumnName="id", onDelete="SET NULL") 

lời giải thích từ here:

  • CASCADE sẽ tuyên truyền sự thay đổi khi thay đổi mẹ. (Nếu bạn xóa một hàng, các hàng trong các bảng bị ràng buộc tham chiếu đến hàng đó cũng sẽ bị xóa, v.v.)
  • SET NULL đặt giá trị cột thành NULL khi hàng gốc bị loại bỏ.

  • RESTRICT làm cho DELETE đã cố gắng của hàng gốc bị lỗi.


... cập nhật cơ sở dữ liệu schema của bạn trước khi phàn nàn nó không làm việc :-)

app/console doctrine:schema:update --force 

nếu điều này không hoạt động do lỗi chính nước ngoài đi theo con đường cứng (theo thứ tự này):

  • app/console doctrine: database: drop
  • .210
  • app/console doctrine: cơ sở dữ liệu: tạo
  • app/console doctrine: schema: cập nhật --force
  • (không bắt buộc: app/console doctrine: đồ đạc: tải)
+0

yeah, đây là nó. Tôi đoán "SET NULL" sẽ hoạt động tốt như "cascade". –

+1

+1 cho điều này và quan trọng để HÃY NHỚ HẠN CHẾ! :) –

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