Household エンティティには、Member エンティティと 1:n の関係があります。これらのエンティティは、新しい世帯を作成するときに簡単に保持できます。私にはわからないのは、メンバー コレクションの 1 つだけを世帯主として指定する最善の方法です。モデルは、ヘッドであるメンバーの ID を持つ世帯エンティティを示し、メンバー エンティティは世帯の ID を持ちます。そのため、世帯エンティティと構成メンバー エンティティが作成されるとき、ヘッドの ID は不明です。この世帯主の関係を確立する方法についての提案を探しています。
リクエストごとに、コード。ソリューション コードが追加されました。クレジットはコメンターnifrに行くべきです!!:
世帯エンティティのスニペット (hohId は世帯主の ID、クライアントはメンバー):
/**
* Household
*
* @ORM\Table(name="household")
* @ORM\Entity
*/
class Household
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="hoh_id", type="integer", nullable=true)
*/
private $hohId;
...
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Client", mappedBy="household")
* @ORM\OrderBy({"id" = "ASC"})
*/
private $clients;
...
//added for solution:
/**
* @var object Member as head of household
* @ORM\OneToOne(targetEntity="Member")
* @ORM\JoinColumn(name="hoh_id", referencedColumnName="id")
* */
private $head;
public function setHead($member) {
$this->head = $member;
return $this;
}
public function getHead() {
return $this->head;
}
}
クライアント (実際にはメンバー) エンティティのスニペット:
/**
* Client
*
* @ORM\Table(name="client", indexes={@ORM\Index(name="idx_client_household_idx", columns={"household_id"}), @ORM\Index(name="idx_client_ethnicity_idx", columns={"ethnicity_id"})})
* @ORM\Entity
*/
class Client
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
...
/**
* @var \Mana\ClientBundle\Entity\Household
*
* @ORM\ManyToOne(targetEntity="Mana\ClientBundle\Entity\Household", inversedBy="clients", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="household_id", referencedColumnName="id")
* })
*/
private $household;
...
}
HouseholdType フォーム クラス スニペット:
->add('isHead','choice', array(
'expanded' => true,
'mapped' => false,
)
プロトタイプ フォーム スニペット:
<tr id="member-form">
<td><input class="smallform" type="radio" name="household[isHead]" value="__name__"></td>
<td>{{ form_widget(form.fname, {'attr': {'class':'smallform'}}) }}</td>
<td>{{ form_widget(form.sname, {'attr': {'class':'smallform'}}) }}</td>
<td>{{ form_widget(form.dob, {'attr': {'class':'smallform'}}) }}</td>
<td>{{ form_widget(form.sex, {'attr': {'class':'smallform'}}) }}</td>
<td>{{ form_widget(form.ethnicity, {'attr': {'class':'smallform'}}) }}</td>
HouseholdController スニペット:
public function createAction(Request $request) {
$household = new Household();
$form = $this->createForm(new HouseholdType(), $household);
$form->bind($request);
if ($form->isValid()) {
$members = $household->getMembers();
$em = $this->getDoctrine()->getManager();
//get household head index
$h = $request->request->get('household');
$hohIdx = $h['isHead'];
$i = 1;
foreach ($members as $member) {
if ($i == $hohIdx) {
$household->setHead($member);
}
$i++;
$member->setHousehold($household);
}
$em->persist($household);
$em->flush();
return $this->redirect($this->generateUrl('household_show', array('id' => $household->getId())));
}
//...
}