私は2つのテーブルを持っています:
ブランチ:
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
BranchMeta:
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| branch_id | int(11) | YES | MUL | NULL | |
| metaname | varchar(255) | NO | | NULL | |
| metavalue | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
「電話」、「メール」など、複数のメタフィールドが必要です。
現在私はこのコードを持っています(セッター/ゲッターは省略されています):
// Entity / Branch.php
<?php
namespace Acme\Bundle\ConsysBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Branch
*
* @ORM\Entity(repositoryClass="Acme\Bundle\ConsysBundle\Entity\BranchRepository")
* @ORM\Table(name="branch")
*/
class Branch
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
*
* @ORM\OneToMany(targetEntity="BranchMeta", mappedBy="branch")
*/
private $metadata;
public function __construct()
{
$this->metadata = new ArrayCollection();
}
}
?>
// Entity / BranchMeta.php
<?php
namespace Acme\Bundle\ConsysBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* BranchMeta
*
* @ORM\Entity(repositoryClass="Acme\Bundle\ConsysBundle\Entity\BranchMetaRepository")
* @ORM\Table(name="branchmeta")
*/
class BranchMeta
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Branch", inversedBy="metadata")
* @ORM\JoinColumn(name="branch_id", referencedColumnName="id")
*/
private $branch;
/**
* @var string
*
* @ORM\Column(name="metaname", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="metavalue", type="string", length=255)
*/
private $value;
?>
次に、次のようなブランチを追加するためのフォームを作成する必要があります。
Branch Name: [_________]
Branch Phone: [_________] [-]
Branch Phone: [_________] [+]
Branch Email: [_________] [-]
Branch Email: [_________] [+]
[Submit]
ここで、「Branch Phone」フィールドは、メタ名「phone」と対応する値を持つbranchmetaテーブルを指し、「Branch Email」フィールドは、メタ名「email」を持つbranchmetaテーブルを指します。どちらも動的に追加/削除できます。
Symfony2のFormBuilderを使用してこれを構築するにはどうすればよいですか?私は次のようにBranchTypeを作成しました:
class BranchType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
}
public function getName()
{
return 'branch';
}
}
そしてBranchMetaType:
class BranchMetaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
$builder->add('value');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\Bundle\ConsysBundle\Entity\BranchMeta',
));
}
public function getName()
{
return 'branch_meta';
}
}
しかし、それから私は立ち往生しました...私の場合、BranchMetaTypeを適切に使用して目的のフォームを構築する方法は?たぶん私はデータマッピングに何かが欠けていますか?