【Symfony2】最近doctrineを使ってあった問題
問題1
問題
relationの削除ができない
ソースコード
・Entity
1 2 3 4 | /** * @ORM\OneToMany(targetEntity="HogeBundle\Entity\OrderDetail", mappedBy="order", cascade={"persist", "remove"}) */ protected $details; |
・Controller:
1 2 3 4 5 6 7 | $em = $this->get('doctrine')->getEntityManager(); $order = $em->getRepository('HogeBundle:Order')->find($id); foreach ($order->getDetails() as $detail) { $em->remove($detail); } $em->flush(); |
対策
orphan-removalとremoveElementを使わないと行けないのようです。
ソースコード(解決)
・Entity
1 2 3 4 | /** * @ORM\OneToMany(targetEntity="HogeBundle\Entity\OrderDetail", mappedBy="order", cascade={"persist", "remove"}, orphanRemoval=true) */ protected $details; |
・Controller:
1 2 3 4 5 6 7 | $em = $this->get('doctrine')->getEntityManager(); $order = $em->getRepository('HogeBundle:Order')->find($id); foreach ($order->getDetails() as $detail) { $order->getDetails()->removeElement($detail); } $em->flush(); |
問題2
問題
Controllerで更新したのに、Templateに表示するrelationが古い
ソースコード
・Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 | $em = $this->get('doctrine')->getEntityManager(); $order = $em->getRepository('HogeBundle:Order')->find($id); // relationを追加 $detail = new OrderDetail(); $detail->setOrder($order); $em->persist($detail); $em->flush(); // templateに渡す return array( "order" => $order, ); |
・Template
1 2 3 | {% for detail in order.details %} {#...#} {% endfor %} |
対策
Controllerでrefreshを使わなければなりません。
ソースコード(解決)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $em = $this->get('doctrine')->getEntityManager(); $order = $em->getRepository('HogeBundle:Order')->find($id); // relationを追加 $detail = new OrderDetail(); $detail->setOrder($order); $em->persist($detail); $em->flush(); // orderをrefresh $em->refresh($order); // templateに渡す return array( "order" => $order, ); |
Author Profile
スターフィールド編集部
SHARE