2020/09/05
Doctrine で クエリを構造化する
はじめに
Symfony2系以降で使われているORMであるDoctrineで
複雑な条件式を書きたい場面がある。
ANDやORなどを体系的に組み込める概念があるが
実例の紹介が少なかったので、ここで一部分を紹介します。
基本的な構文
いつもの書式で書く。
Orderが注文でConsumerが購入した顧客情報。
今回の抽出条件は15歳以上20歳以下の女性または25歳以上30歳以下の男性の注文とする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $qb = $em->getRepository('SampleBundle:Order') ->createQueryBuilder('o') ->innerJoin('o.consumer', 'c'); $qb->where('1=1'); $qb->andWhere($qb->expr()->andX $qb->expr()->eq('sex', 'female') , $qb->expr()->andX( $qb->expr()->gte('c.age', 15) , $qb->expr()->lte('c.age', 20) ) ); $qb->orWhere($qb->expr()->andX $qb->expr()->eq('sex', 'male') , $qb->expr()->andX( $qb->expr()->gte('c.age', 25) , $qb->expr()->lte('c.age', 30) ) ); |
改良後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $qb = $em->getRepository('SampleBundle:Order') ->createQueryBuilder('o') ->innerJoin('o.consumer', 'c'); $qb->where('1=1'); // 各性別ごとの条件 $genderOrCond = $qb->expr()->orX(); // 女性の条件 $femaleCond->add($qb->expr()->gte('c.age', 15)); $femaleCond->add($qb->expr()->lte('c.age', 20)); $femaleCond->add($qb->expr()->eq('c.gender', 'female')); // 男性の条件 $maleCond->add($qb->expr()->gte('c.age', 25)); $maleCond->add($qb->expr()->lte('c.age', 30)); $maleCond->add($qb->expr()->eq('c.gender', 'male')); $genderOrCond->add($femaleCond); $genderOrCond->add($maleCond); $qb->andWhere($genderOrCond); |
総評
オブジェクト的な考え方を入れることで
条件の管理もしやすいというメリットもありました。
Author Profile
スターフィールド編集部
SHARE