在具有Symfony2上的复合主键的实体的表单上有多对多

时间:2012-08-16 19:27:19

标签: forms symfony many-to-many

我正在尝试创建一个表单来管理以多对多方式相关的2个实体的关系。

这些实体是PHONE和GROUP。

两个实体都有一个复合主键, ID USER 用于GROUP实体, PHONE USER 用于电话实体,是:

  • ID :数字自动增量唯一
  • 电话:数字
  • USER :用户ID,链接到未显示的其他实体。

我正在使用复合键在数据库服务器上集群索引。

我的2个实体定义如下: 电话实体

class Phone
{ 
/**
 * @var integer $phoneNo
 * 
 * @ORM\Column(name="phone_no", type="bigint", nullable=false)
 * @ORM\Id
 * 
 */
private $phoneNo;

/**
 * @var Group
 *
 * @ORM\ManyToMany(targetEntity="Group", inversedBy="phone")
 * @ORM\JoinTable(name="phone_has_group",
 *   joinColumns={
 *      @ORM\JoinColumn(name="user", referencedColumnName="user"),
 *      @ORM\JoinColumn(name="phone_no", referencedColumnName="phone_no")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="group_contact", referencedColumnName="id")
 *   }
 * )
 */
private $group; 

/**
 * @var User
 *
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user", referencedColumnName="id")
 * })
 * @ORM\Id
 */
private $user;

// more properties, getters and setters...
}

集团实体

class Group
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=45, nullable=false)
 */
private $name;

/**
 * @var Phone
 *
 * @ORM\ManyToMany(targetEntity="Phone", mappedBy="group")
 */
private $phone;

/**
 * @var User
 *
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user", referencedColumnName="id")
 * }) 
 * @ORM\Id
 */
private $user;

// more properties, getters and setters...
}

这些实体的关系工作得很好。当我尝试创建一个表单来管理这两个实体之间的关系时,会出现问题。

我的代码:

class GroupType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('name', 'text', 
                array('label' => 'Nombre')) 
        ->add('phone', 'entity', 
                array(
                    'label' => 'Contactos en este grupo',
                    'class' => 'SMSBundle:Phone',
                    'expanded' => false,
                    'required' => false,
                    'multiple' => true,
                ))  
    ;
}

生成这个:

<select id="e_keyword_phone" name="e_keyword[phone][]" multiple="multiple">
  <option value="0">4490000000</option>
  <option value="1">4490000001</option>
  <option value="2">4490000002</option>
  <option value="3">4490000003</option>
  <option value="4">4490000004</option>
  <option value="5">4490000005</option>
</select>

通常,每个选项标记上的属性表示所选实体的ID ...但我不是使用单列ID而是使用2列复合键!!!

此处,正在生成任意增量编号,导致所选值未链接到正确的实体,并且不会保留在数据库中。

如何在不摆脱复合键的情况下完成这项工作?

1 个答案:

答案 0 :(得分:0)

很久以前就问过这个问题了,我是这个主题的新手,但我很确定你必须创建一个额外的实体类并按照{{3 }}