2011-06-20 17 views
5

Tôi đang thực hiện chuyển đổi từ học thuyết 1.2 thành 2.x và đang chạy vào một vấn đề lạ.học thuyết 2 vẫn cố gắng để chèn các mục hiện có thay vì cập nhật chúng

Tôi có một thực thể CompositionRule có thuộc tính $ buildingBlock, trỏ đến một thực thể BuildingBlock.

Tôi đặt thuộc tính này, làm cho nó trỏ đến một BuildingBlock hiện có mà tôi tìm nạp từ cơ sở dữ liệu.

Khi tôi tiếp tục đối tượng chính (CompositionRule), thực thể cố gắng tạo mục BuildingBlock mới và chèn nó vào cơ sở dữ liệu thay vì chỉ chấp nhận rằng nó đã tồn tại và bỏ qua nó.

Tôi không thấy những gì tôi thiếu ở đây như trong học thuyết 1.2 khi bạn thực thi $ entity-> save(); tất cả các đối tượng cơ bản được xử lý một cách chính xác.

Dưới đây là một số bộ phận của ánh xạ của tôi/code:

CompositionRule:

<many-to-one field="buildingBlock" target-entity="BuildingBlock"> 
    <cascade><cascade-all /></cascade> 
</many-to-one> 
.. 
public function setBuildingBlock($buildingBlock) { 
    $buildingBlock->addCompositionRule($this); 
    $this->buildingBlock = $buildingBlock; 
} 

BuildingBlock

<one-to-many field="compositionRules" target-entity="CompositionRule" mapped-by="buildingBlock"> 
    <cascade> 
     <cascade-all /> 
    </cascade> 
</one-to-many> 

public function addCompositionRule($rule) { 
    $this->compositionRules->add($rule); 
} 
+0

Có cùng một vấn đề ở đây. Bạn có tìm ra giải pháp nào không? – Bono

+0

Tương tự ở đây. +1. Cách giải quyết tạm thời của tôi là lặp $ em-> getUnitOfWork() -> getScheduledEntityInsertions() và loại bỏ các thực thể cụ thể ... – tiriana

Trả lời

10

tôi uderstood rằng đó là một câu hỏi cũ, nhưng tôi đã cùng một vấn đề gần đây, vì vậy nó có thể giúp có thể.

Điều này xảy ra do trạng thái "tách biệt" của pháp nhân của bạn. Bạn nên sử dụng hàm doctrine :: merge() để sửa lỗi này.

$rule = new CompositionRule; 
$block = $entityManager->merge($block); //it's important to use result of function, not the same element 
$entityManager->persist($role); 
$entityManager->flush(); 
+2

Tôi thực sự đã hỏi câu hỏi này cách đây 3 năm. Trong khi đó tôi chưa làm việc với Doctrine. Tôi biết nhiều hơn một chút về khung công tác ORM nói chung và điều này trông giống như một câu trả lời hay. Tôi chấp nhận nó cho những người khác vấp ngã khi đặt câu hỏi. Vui mừng vì bạn đã giải quyết nó! – geoffreydv

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