こんにちわ、今回からは、Symfony2にデフォルトで付属しているORMであるDoctrine2の小ネタを紹介したいと思います。半分は備忘録になります
今日は、一度に多数のデータを挿入したいときはどうするの?です。基本的な使い方は
http://docs.symfony.gr.jp/symfony2/book/doctrine.htmlを参照してください。
エンティティ
use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $name; /** * @ORM\Column(type="decimal", scale=2) */ protected $price; /** * @ORM\Column(type="text") */ protected $description; }
公式ページのまま利用しています。
こちらを普通にInsertするときは
単独Insert
public function createAction() { $product = new Product(); $product->setName('A Foo Bar'); $product->setPrice('19.99'); $product->setDescription('Lorem ipsum dolor'); $em = $this->getDoctrine()->getEntityManager(); $em->persist($product); $em->flush(); return new Response('Created product'); }
です、では、複数個のProductを同時にInsertする場合はどうすればよいでしょう。
ポイントは、Doctrine2のエンティティマネージャーは
- persistでは、オブジェクトを管理下におくだけ
- flushで管理しているオブジェクトに対応した、SQL文を発行する
という点です、これに従って書いてみましょう
複数Insert
public function createManyAction() { $em = $this->getDoctrine()->getEntityManager(); $names = Array("a", "b"); $prices = Array(100, 200); $descriptions = Array("hello", "goodbye"); for($i = 0; $i < 2; $i++){ $product = new Product(); $product->setName($names[$i]); $product->setPrice($prices[$i]); $product->setDescription($descriptions[$i]); $em->persist($product); } $em->flush(); return new Response('Created products'); }
となります。persistにはPDOでいうprepareの役割もあるので、この方法だとクエリーキャッシュを有効に利用できるそうです。http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html?highlight=batchなどが参考になるでしょうか。
一気にInsertするのではなく、forの中でInsertを実行したい場合、以下のようになります
複数Insert1回ごと
public function createManyAction() { $em = $this->getDoctrine()->getEntityManager(); $names = Array("a", "b"); $prices = Array(100, 200); $descriptions = Array("hello", "goodbye"); for($i = 0; $i < 2; $i++){ $product = new Product(); $product->setName($names[$i]); $product->setPrice($prices[$i]); $product->setDescription($descriptions[$i]); $em->persist($product); $em->flush(); $em->clear(); } return new Response('Created products'); }
SQLを発行するたびに、管理するオブジェクトをクリアしている点がポイントです。
今回はこれで失礼いたします。
投稿者プロフィール
-
中の人には主に、
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検索結果画面にパンくずリストを表示する方法 (リッチスニペット対応)