如何强制底层表单对象超越父实体的关系?

时间:2015-04-01 09:38:28

标签: symfony doctrine-orm symfony-forms

我有一个主实体和第二个。

假设你有一张地图,地图上有一些坐标点。

我希望能够为点添加动态新记录,以便我选择表单类型的集合类型。

我还有第二个实体的正确表单类型。一切都很好,除了新的添加点不与主实体保持一致。如何告诉表单超越父实体并设置为适当的setter?

$builder->add('routePoints', 'collection', ['required' => false,'label' => '','attr'=>['class'=>'route-point'],'by_reference'=> true, 'type' => new MapCoordinateAdminType(), 'allow_add' => true, 'delete_empty' => true, 'allow_delete' => true, 'translation_domain' => 'maps']);

主要实体

/**
 * @var array
 * @ORM\OneToMany(targetEntity="ADN\CustomBundle\Entity\MapCoordinate", cascade={"persist","remove"}, mappedBy="map")
 * @ORM\JoinColumn(onDelete="CASCADE",name="route_points",nullable=true, referencedColumnName="map")
 */
protected $routePoints;

点实体

/**
 * @ORM\ManyToOne(inversedBy="routePoints", targetEntity="ADN\CustomBundle\Entity\CycleMap")
 * @ORM\JoinColumn(name="map",referencedColumnName="id")
 */
protected $map;

1 个答案:

答案 0 :(得分:1)

您的第二个实体实例不会保留,因为它们属于双向关系的反面。您可以在Doctrine documentation上找到更多相关信息。

为了解决您的问题,您还需要更新拥有方。为此,主实体需要进行单行更改:

<?php
/** Master entity */
use ADN\CustomBundle\Entity\MapCoordinate;

class CycleMap
{
    // ...

    public function addRoutePoint(MapCoordinate $routePoint)
    {
         // The magical line
         $routePoint->setMap($this);

         $this->routePoints[] = $routePoint;

         return $this;
    }
}