多対多の方法で関連する 2 つのエンティティの関係を管理するフォームを作成しようとしています。
これらのエンティティは、PHONE と GROUP です。
両方のエンティティには、複合主キー、GROUP エンティティのIDとUSER 、およびPHONE エンティティの PHONEとUSERがあります。
- ID : 数値の自動インクリメンタル ユニーク
- PHONE : 数値
- USER : ユーザー ID。表示されていない別のエンティティにリンクされています。
複合キーを使用して、DB サーバーでインデックスをクラスター化しています。
私の 2 つのエンティティは次のように定義されています: Phone エンティティ
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...
}
このエンティティの関係は問題なく機能しています。この 2 つのエンティティ間の関係を管理するフォームを作成しようとすると、問題が発生します。
私のコード:
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 列の複合キーを使用しています!!!
ここでは、任意の増分番号が生成されているため、選択した値が適切なエンティティにリンクされず、データベースに保持されません。
複合キーを削除せずにこれを機能させるにはどうすればよいですか?