我以前可能问过这样的问题,但我认为它没有得到充分的回答。这真的让我很困扰,因为我真的不明白为什么这是一个问题。
我有两个实体,一个叫做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