0

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())));
        }
//...
}
4

2 に答える 2

0

ソリューションの基本は次のとおりです。クレジットは、コメンターの 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())));
        }
//...
}
于 2013-08-07T23:22:22.317 に答える