前回に引き続き、今回はSymfony2のデータベース処理に使われるDoctrine2のリレーションのうちOneToManyとManyToOneを説明しましょう。
詳しい中身はこちらの英語ドキュメントを参照しましょう。
http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html
前回と同じエンティティを用います、不必要な部分に関しては省略します。
TblTicket.php
<?php namespace Hoge\FugaBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * * @ORM\Table(name="tbl_ticket") * @ORM\Entity(repositoryClass="Hoge\FugaBundle\Repository\TicketRepository") */ class TblTicket { /** * @var bigint $id * * @ORM\Column(name="id", type="bigint", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ protected $id; /** * @ORM\ManyToOne(targetEntity="TblTicket", inversedBy="childs") * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true) */ private $parent; /** * @ORM\OneToMany(targetEntity="TblTicket", mappedBy="parent") */ private $childs; /** * @ORM\OneToOne(targetEntity="TblTicketData", mappedBy="ticket", cascade={"persist"}) */ private $data; public function __construct(){ $this->childs = new ArrayCollection(); } /** * Get id * * @return bigint */ public function getId() { return $this->id; } /** * get parent * @return TblTicket */ public function getParent () { return $this->parent; } /** * setparent * @param TblTicket $parent * @return TblTicket */ public function setParent ($parent) { $this->parent = $parent; return $this; } /** * get data * @return TblTicketData */ public function getData () { return $this->data; } /** * set data * @param TblTicketData $parentData * @return TblTicketData */ public function setParentData ($parentData) { $this->parentData = $parentData; return $this; } /** * Add childs * * @param TblTicket $childs */ public function addChild(TblTicket $childs) { $this->childs[] = $childs; } /** * Get childs * * @return Doctrine\Common\Collections\Collection */ public function getChilds() { return $this->childs; } }
今回はTblTicketData.php は使う必要がないので、省略します。
前回同様SQL文に関しても、記載します。
CREATE TABLE tbl_ticket ( id bigint(20) NOT NULL AUTO_INCREMENT, parent_id bigint(20) DEFAULT NULL, PRIMARY KEY (id), KEY IDX_1A06C41C727ACA70 (parent_id), ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ここから、判断できるポイントを列挙していきましょう。
- tbl_ticketは木構造となっており、親チケットを自身のテーブルに持っている
- tbl_ticketは一番親のチケットを判断するために、parent_idにNullを許可している
では、エンティティの中身を見てみましょう
$parent
@ORM\ManyToOne(targetEntity="TblTicket", inversedBy="childs") @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
$childs
@ORM\OneToMany(targetEntity="TblTicket", mappedBy="parent")
ポイントは
- 所属する側のデータ($parent)にはManyToOne inversedByとJoinColumnを付与する
- 所属される側のデータ($childs)にはOneToMany mappedByを付与する
- JoinColumnによってTblTicketのparent_idとTblTicketのid間のリレーションが作られる
- nullable=trueによって、Parentの存在を保障しない
です。
では、続いて、このデータのInsertに関して考えてみましょう。
Insert
public function createAction() { $ticket = new TblTicket(); $child = new TblTicket(); $child->setParent($ticket); $em = $this->getDoctrine()->getEntityManager(); $em->persist($ticket); $em->persist($child); $em->flush(); return new Response('Created ticket'); }
もしもチケットに対して親チケットを設定する必要があれば、setParentを呼び出しましょう。
注意!
OneToManyによって設定された、Attributeはかならず
public function __construct(){ $this->childs = new ArrayCollection(); }
によって初期化されなければいけません。
では今日はこの辺で、失礼いたします。
投稿者プロフィール
-
中の人には主に、
PHP・Symfony2系の人と
Ruby・Rails系の人がいます。
ときどきJavascript・データベースにも手を出すかもしれません。
最新の投稿
- データベース2015年2月3日Symfony2 Doctrine2の小ネタ(OneToMany,ManyToOneリレーション)
- データベース2015年1月28日Symfony2 Doctrine2の小ネタ(OneToOneリレーション)
- 開発2015年1月21日Symfony2でもデザインパターン(PHPクラス編)
- 開発2014年11月26日Google検索結果画面にパンくずリストを表示する方法 (リッチスニペット対応)