在form builder中使用实体的Symfony2只有在multiple设置为true时才能工作



我以前可能问过这样的问题,但我认为它没有得到充分的回答。这真的让我很困扰,因为我真的不明白为什么这是一个问题。

我有两个实体,一个叫做Containers.php,另一个叫做ContainerType.php——用户可以添加一个容器并从下拉菜单中选择一个类型(这是使用表单构建器中的Entity生成的)。这是有效的,并且正确地保存在连接表中。但是,如果用户稍后继续尝试编辑这个,则下拉列表将被重置(即无法找到现有类型),如果从编辑表单中选择了另一种类型,则只将其添加到连接表中,而不是更新,因此您将获得两个关联。

下面是container和ContainerType的映射:

/**
 * Containers
 *
 * @ORMTable(name="containers")
 * @ORMEntity
 */
class Containers
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="number", type="string", length=255)
     */
    private $number;
    /**
     * @ORMManyToMany(targetEntity="ContainerType")
     *
     * @ORMJoinColumn(name="id", referencedColumnName="container")
     */
    protected $type;

    public function __construct()
    {
        $this->type = new ArrayCollection();
    }

和Type的setter和getter:

/**
     * Add type
     *
     * @param AppBundleEntityContainerType $type
     *
     * @return Containers
     */
    public function addType(ContainerType $type)
    {
        $this->type[] = $type;
        return $this;
    }
    /**
     * Set type
     *
     * @param ArrayCollection $type
     *
     * @return Containers
     */
    public function setType($type)
    {
        $this->type[] = $type;
        return $this;
    }
    /**
     * Get type
     *
     * @return ContainerType
     */
    public function getType()
    {
        return $this->type;
    }

下面是ContainerType.php中的映射:

/**
 * ContainerType
 *
 * @ORMTable(name="container_type")
 * @ORMEntity
 * @ORMHasLifecycleCallbacks()
 */
class ContainerType
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="type", type="string", length=255)
     */
    private $type;
    /**
     * @param AppBundleEntityContainers
     *
     * ORM@ManyToMany(targetEntity="Containers", mappedBy="type")
     */
    protected $container;

我添加/编辑容器的表单类型如下:

$builder->add('number' , 'text', array('label' => 'Container Number'));
        $builder->add('type'  , 'entity',
            array(
                'class' => 'AppBundle:ContainerType',
                'label' => 'Container Type',
                'choice_label' => 'type',
                'empty_value' => '-- Please Select --',
                'multiple' => false
            ));
        $builder->add('save', 'submit', array(
            'attr' => array(
                'class' => 'btn btn-material-blue-800 btn-raised',
                'value' => 'Save'
            ),
        ));

正如您所看到的,multiple被设置为FALSE,这正是我想要的——我只想显示一个下拉菜单,因为只有一种类型可以分配给容器。如果有人可以帮助我与我的映射(如果他们是不正确的,虽然当我运行学说:schema:validate似乎他们是好的),那么我将感激不尽。

否则,我不明白为什么当我将多个设置为true时,它只在编辑上正确工作/保存。这肯定不是唯一的办法吧?

提前感谢迈克尔。

您需要实现的不是多对多关系,而是多对一关系。查看这些文档获取更多信息:

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

http://symfony.com/doc/current/book/doctrine.html

最新更新