2011-10-14 29 views
10

Xin chào Tôi có vấn đề khi cố gắng để loại bỏ các thực thể loại bỏ trong quan hệ OneToMany. Sau một vài giờ gỡ lỗi, tôi đã cố gắng hạ cấp học thuyết từ phiên bản 2.1.2 xuống 2.0.2 mới nhất và nó đột nhiên bắt đầu hoạt động.Doctrine 2.0 vs 2.1 cascade loại bỏ OneToMany

Hãy tưởng tượng hai thực thể Công ty và Địa chỉ liên quan 1: N.

/** 
* @Entity 
*/ 
class Company extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Collection 
    * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"}) 
    */ 
private $addresses; 
} 



/** 
* @Entity 
*/ 
class Address extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Company 
    * @ManyToOne(targetEntity="Company", inversedBy="addresses") 
    * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false) 
    */ 
private $company; 
} 

khi tôi cố gắng xóa đối tượng Công ty, tôi cũng muốn các địa chỉ được chỉ định cũng sẽ bị xóa.

$em->remove($company); 
$em->flush(); 

Trong học thuyết 2.1.2 việc xóa địa chỉ không được thực hiện để ràng buộc toàn vẹn không thành công. Trong phiên bản 2.0.2, nó hoạt động hoàn hảo. Điều Wierd trên nó là, nếu tôi sử dụng phần mở rộng EntityAudit https://github.com/simplethings/EntityAudit LogRevisionListener là phiên bản sửa lỗi các thực thể địa chỉ (đặt chúng revtype = DEL) trong học thuyết 2.1.2 (tất nhiên trong 2.0.2) nhưng UnitOfWork không loại bỏ nó.

Có sự khác biệt nào về cách xử lý loại bỏ tầng trong 2.0.2 và trong 2.1.2 không?

Thank you very much

+0

Tôi tình cờ gặp vấn đề này hôm nay, tôi đang sử dụng 2.1.6. :/ – mokagio

+0

Vâng, tôi phải sửa bản thân mình, nó hoạt động cho tôi ngay bây giờ! Tôi đã sử dụng 'cascade = {" all "}' nhưng khi tôi thay đổi nó trong 'cascade = {" remove "}' mọi thứ bắt đầu hoạt động tốt. – mokagio

+0

Mặc dù tôi phải nói rằng có lẽ vấn đề của tôi có thể không hoàn toàn do chú thích hoặc Doctrine, bởi vì tôi đang thực hiện thao tác chuyên sâu trên thực thể và sau khi kiểm tra kết hợp các tùy chọn xếp tầng, tôi phát hiện ra rằng '" hợp nhất "' tùy chọn là một trong những vấn đề. Hy vọng nó giúp anyway :) – mokagio

Trả lời

1

Tôi đã gặp cùng một vấn đề và tôi đã giải quyết anh ta với mã:

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

lẽ bạn có thể sử dụng một findAll trên company của bạn cho các địa chỉ và loại bỏ điều này với a foreach như thế:

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

Đó không phải là một phương pháp rất tốt nhưng bây giờ, đó là tất cả những gì tôi đã tìm.

+1

Tôi đã giải quyết nó ra downgrading doctrine :) cảm ơn, nhưng nó không phải là phương pháp whaich tôi đang tìm kiếm :(nó có thể có thể là một lỗi (hoặc một tính năng?) – stefi

10

Hãy thử sử dụng này trên addresses thuộc tính của Company Class

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

tôi bằng cách sử dụng học thuyết 2.2.3 và vẫn như cũ.Đã thêm orphanRemoval = true Loại kỳ lạ vì Im không loại bỏ một bên để không tạo ra bất kỳ đứa trẻ mồ côi Có lẽ vì bên nhiều là bên sở hữu và tôi đang loại bỏ từ một phía .Cập nhật làm việc vì nhiều bên là bên sở hữu và tôi đang sử dụng '$ this-> addSomething (theThing)' và 'theThing-> setSomething ($ this)' ở đây như thể tôi đang xóa theThing không có thiết lập gì đó , chỉ '$ this-> removeSomething (theThing)' – HMR

3

tôi đã cùng một vấn đề ... Quan hệ đã được thêm hoặc cập nhật, nhưng không bị xóa, thậm chí nếu tôi có thác: [tồn tại , tẩy].

Tôi phát hiện ra rằng tôi không cần thuộc tính "xóa" trong "thác", nhưng tôi phải thêm orphanRemoval: true.

Tôi đã phát điên, bạn đã thực hiện một ngày của tôi!

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