【问题标题】:Doctrine 2.1 - Relation Lost After ManyToMany Cascade Merge - Symfony2Doctrine 2.1 - 多对多级联合并后关系丢失 - Symfony2
【发布时间】:2015-11-19 15:34:13
【问题描述】:

在合并一个具有相关实体且关系设置为级联持久化和合并操作的实体后,关系将丢失!

以下是实体:

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;
}

这是我的加入:

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

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

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

这是我的合并代码:

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

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

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

...这是输出:

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

..数据库看起来像这样:

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

谁能看出我哪里傻了?

顺便说一句,还有比这更多的关系。我在这里简化了一些事情以使解释更清楚。我的其他关系不会受到合并的负面影响。另外,我正在控制台命令中进行合并,而不是在控制器中进行合并。如果有帮助,我可以发布更多代码:)

我也在使用 Doctrine 2.1.7 和 Symfony 2.0.15

非常感谢,马修

【问题讨论】:

  • 原则 ORM 文档建议在合并的情况下使用受保护属性而不是私有属性。我认为值得一试。另外,你为什么要使用合并?

标签: symfony merge doctrine-orm many-to-many cascade


【解决方案1】:

我遇到了同样的问题,并通过在合并后刷新实体来修复它:

$mergedEntity = $entityManager->merge($serializedEntity);
$entityManager->refresh($mergedEntity);

【讨论】:

    【解决方案2】:

    我发现了同样的问题,思考了几分钟后,我尝试了一个简单的想法,只需更改代码顺序并将合并后的实体视为实体的新实例,我发现合并操作可以删除关系,所以:

    $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();
    

    它对我有用。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2011-06-29
      • 2018-06-28
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多