2012-06-25 24 views
5

Sau khi hợp nhất một thực thể có các thực thể liên quan với các mối quan hệ được thiết lập để thực hiện các hoạt động liên tục và hợp nhất, các mối quan hệ bị mất!Doctrine 2.1 - Relation Lost After ManyToMany Cascade Merge - Symfony2

Dưới đây là các đối tượng:

class Event implements NormalizableInterface 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Participant", inversedBy="events", cascade={"persist", "merge"}) 
    * @ORM\JoinTable(name="event_participant", 
    *  joinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id", onDelete="CASCADE")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="participant_id", referencedColumnName="id", onDelete="CASCADE")} 
    *  ) 
    */ 
    private $participants; 
} 


class Participant implements NormalizableInterface 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Event", mappedBy="participants", cascade={"persist", "merge"}) 
    */ 
    protected $events; 
} 

Dưới đây là tham gia của tôi:

foreach ($events as $event) 
{ 
    if (!$event->hasParticipant($participant)) { 

     $event->addParticipant($participant); 
    } 
    if (!$participant->hasEvent($event)) { 

     $participant->addEvent($event); 
    } 
} 

Đây là mã hợp nhất của tôi:

echo "Before merge participant count: ".count($event->getParticipants()).PHP_EOL; 

$event = $em->merge($event); 

echo "After merge participant count: ".count($event->getParticipants()).PHP_EOL; 

... và đây là kết quả:

Before merge participant count: 2 
After merge participant count: 0 

..và cơ sở dữ liệu trông như thế này:

table    | rows 
------------------------------- 
event    | 1 
------------------------------- 
participant   | 2 
------------------------------- 
event_participant | 0 
------------------------------- 

bất cứ ai có thể nhìn thấy nơi tôi đang bị câm?

BTW có nhiều mối quan hệ hơn thế này. Tôi đã đơn giản hóa mọi thứ ở đây để làm cho giải thích rõ ràng hơn. Các mối quan hệ khác của tôi không bị ảnh hưởng tiêu cực bởi sự hợp nhất. Ngoài ra tôi đang làm việc hợp nhất trong một giao diện điều khiển Command không phải là một trong một bộ điều khiển. Tôi có thể gửi mã hơn nếu nó sẽ giúp :)

Ngoài ra tôi đang sử dụng Học thuyết 2.1.7 và Symfony 2.0.15

Rất cám ơn, Matthew

+0

Các tài liệu ORM thuyết khuyên bạn nên sử dụng tài sản được bảo vệ thay vì một cá nhân, trong một trường hợp hợp nhất. Tôi nghĩ rằng nó có giá trị để thử. Ngoài ra, tại sao bạn sử dụng hợp nhất? – AdrienBrault

Trả lời

1

tôi tìm thấy cùng một vấn đề và sau khi nghĩ rằng một vài phút tôi đã thử một cách đơn giản, chỉ cần thay đổi thứ tự mã và xử lý các trường hợp mới như của thực thể, tôi tìm ra rằng hành động hợp nhất có thể được loại bỏ các mối quan hệ, vì vậy:

$user = new User(); 
$user->setName('name'); 
$user->setAge('24'); 

$mergedUser = $em->merge($user); 

// Imagine we have some groups to add 
foreach ($groups as $group) { 
    $mergedUser->addGroup($group); 
} 

$em->flush(); 

Tác phẩm của nó dành cho tôi.

Tôi hy vọng điều đó sẽ hữu ích.

3

tôi đã phải đối mặt với cùng một vấn đề, và cố định nó bằng cách làm mới tổ chức sau khi hợp nhất:

$mergedEntity = $entityManager->merge($serializedEntity); 
$entityManager->refresh($mergedEntity); 
Các vấn đề liên quan