Сохранение объекта в действии POST контроллера для EasyAdminBundle

Я пытаюсь добавить какое-то пользовательское действие в symfony EasyAdminBundle, я только что добавил представление формы без проблем, но проблема связана с этим действием POST формы, это другой метод того же контроллера, который работает хорошо, но когда я делаю persist() и flush() для диспетчера сущностей просто ничего не делает. Это мой код, все работает как положено, за исключением того, что изменения не применяются в базе данных.

/**
 * @Route("/product-segment/save/{id}", name="admin_product_segment_save")
 */
public function saveSegmentsAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $product = $em->getRepository('AppBundle:product')->find($id);

    foreach ($product->getSegments() as $segment)
    {
        error_log("Product has segment " . $segment->getId());
    }

    $product->removeAllSegments();

    foreach ($product->getSegments() as $segment)
    {
        error_log("Now prod has  " . $segment->getId());
    }

    $em->persist($product);
    $em->flush();

    foreach ($this->getRequest()->request->all() as $post_var => $segment_id)
    {
        if ($post_var == 'segment_id')
        {
            $segment = $em->getRepository('AppBundle:Segment')->find($segment_id);
            $product->addSegment($segment);
        }
    }
    $em->persist($product);
    $em->flush();

    // redirect to the 'list' view of the given entity
    return $this->redirectToRoute('admin', array(
        'view'   => 'list',
        'entity' => 'Product',
    ));
}

EDIT: это отношение моей сущности

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Segment", mappedBy="products", cascade={"all"})
 * @ORM\JoinTable(
 *      joinColumns={@ORM\JoinColumn(onDelete="CASCADE")},
 *      inverseJoinColumns={@ORM\JoinColumn(onDelete="CASCADE")}
 * )
 */
protected $segments;

person K. Weber    schedule 06.07.2015    source источник
comment
Есть ли у вас сохранение каскада и удаления в отношении ваших сущностей? Также вы хотите сбрасывать как можно меньше раз, поэтому сбрасывать только один раз перед возвратом.   -  person mr12086    schedule 06.07.2015
comment
@ mr12086 Я добавил код отношения сущностей, он должен быть сохранен, но я добавил дополнительный текст, и сохранение действительно работает, поэтому проблема должна быть связана с каскадированием. Кстати, двойной вызов для сохранения и сброса предназначен только для ведения журнала и отладки. спасибо   -  person K. Weber    schedule 06.07.2015
comment
Это было на самом деле, отношения не были четко определены с обеих сторон   -  person K. Weber    schedule 06.07.2015


Ответы (1)


Сначала вы должны вызвать флеш только один раз в своем коде, и если у вас есть свой объект так, как вы:

$em = $this->getDoctrine()->getManager(); $product = $em->getRepository('AppBundle:product')->find($id);

Вам не нужно настаивать на этом снова. У менеджера сущностей уже есть этот объект. По поводу акции ничего не делаю. Проверьте, определено ли отношение ManyToMany с обеих сторон. И ваш метод removeAllSegments делает то, что вы хотите.

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

person Simon Berton    schedule 21.10.2015