Slide 1

Slide 1 text

EC-CUBE3ίʔυϦʔσΟϯά #4 EC-CUBEؔ੢Ϣʔβάϧʔϓ 2016-03-02

Slide 2

Slide 2 text

໨࣍ 1. Doctrineͷ֓ཁ 2. DoctrineΛ࢖ͬͨςʔϒϧఆٛ 3. DoctrineΛ࢖ͬͨDBΞΫηε
 RepositoryɺfindϝιουɺDQLͷઆ໌ 4. EC-CUBE3ίʔυϦʔσΟϯά
 ؅ཧը໘ͷ঎඼؅ཧ౳ 5. ࣭ٙԠ౴౳

Slide 3

Slide 3 text

1.Doctrineͷ֓ཁ

Slide 4

Slide 4 text

Doctrineͷ֓ཁ • Doctrineͱ͸PHPͰॻ͔ΕͨO/RϚούʔͰ͢ɻ • ΋͏গ͠ݫີʹઆ໌͢ΔͱDoctrine͸PDOΛར༻ͨ͠ҎԼͷओཁͳϥΠϒϥϦͰߏ੒͞ Ε͓ͯΓɺ૯শͱͯ͠ҰൠతʹO/RϚούʔͱݺ͹Ε͍ͯ·͢ɻ DoctrineCommon : ڞ௨ϥΠϒϥϦ DoctrineDBAL : ֤DBMSͷࠩ෼Λٵऩ͢ΔϨΠϠʔ DoctrineORM : O/RϚούʔ • ORM(Object Relational Mapping)ͱ͸ϓϩάϥϛϯάݴޠͷςΫχοΫͰ͋Γɺσʔλ ϕʔεͱΦϒδΣΫτࢦ޲ϓϩάϥϛϯάݴޠͷؒͷඇޓ׵ͳσʔλΛม׵͢Δϓϩά ϥϛϯάٕ๏Ͱ͢ɻMySQL౳ͷσʔλϕʔεͷσʔλΛૢ࡞͠΍͍͢Α͏ʹ PHP Φϒ δΣΫτʹม׵͠·͢ɻ • DBAL(Database Abstraction Layer)ͱ͸PDOͷந৅ϨΠϠʔͰɺσʔλϕʔεͱ΍Γऔ Γ͢ΔAPIΛఏڙ͠·͢ɻ

Slide 5

Slide 5 text

2.DoctrineΛ࢖ͬͨςʔϒϧఆٛ

Slide 6

Slide 6 text

DoctrineΛ࢖ͬͨςʔϒϧఆٛ • ຊདྷσʔλϕʔεͷςʔϒϧΛ࡞੒͢Δʹ͸create tableจͰSQLจΛ࢖ͬͯ࡞੒͠· ͕͢ɺDoctrine͸Ruby on Rails༝དྷͷmigrationػೳΛ࢖ͬͯσʔλϕʔε؅ཧΛ͠· ͢ɻ • ࣮ࡍʹ͸ҎԼͷखॱΛ࢖ͬͯςʔϒϧΛ࡞੒͠·͢ɻ 1.ϝλσʔλͱݺ͹ΕΔઃఆϑΝΠϧ(xxxx.dcm.yml)ʹςʔϒϧΛఆٛ
 ˠECCUBEROOT/src/Eccube/Resource/doctrine ʹଘࡏ 2.ymlϑΝΠϧʹରԠ͢ΔΤϯςΟςΟΫϥεΛ࡞੒
 ˠECCUBEROOT/src/Eccube/Entity ʹଘࡏ 3.doctrine migrationػೳΛ࢖ͬͯσʔλϕʔεʹద༻
 ˠymlϑΝΠϧͱEntityΛ΋ͱʹςʔϒϧ࡞੒ɺmigration࣌ͷόʔδϣϯ؅ཧ༻ςʔ ϒϧ΋࡞੒ 4.ςʔϒϧʹมߋ͕ೖΕ͹ɺ1ɺ2ɺ3ͷखॱΛ܁Γฦͯ͠σʔλϕʔεʹద༻

Slide 7

Slide 7 text

ςʔϒϧΛ࡞੒͠Α͏ • ຊମʹରͯ͠ςʔϒϧΛ࡞੒͢Δ͜ͱ͸͋Γ·ͤΜ͕ɺࠓޙ ͷͨΊʹςʔϒϧͷ࡞੒ํ๏Λઆ໌͓͖ͯ͠·͢ɻ • ςʔϒϧΛ࡞੒͢ΔͨΊʹඞཁͳϑΝΠϧ͸ɺ
 dcm.ymlϑΝΠϧ (ςʔϒϧఆٛͨ͠ymlϑΝΠϧ)
 EntityΫϥε (ςʔϒϧΛදͨ͠phpΫϥε)
 ͕࠷௿ݶඞཁͱͳΓ·͢ɻ • RepositoryΫϥε (ςʔϒϧʹΞΫηε͢ΔΫϥε)͸ࠓճ ͋ͬͯ΋ͳͯ͘΋ߏ͍·ͤΜ͕ɺEC-CUBE3Ͱ͸ඞͣ࡞੒͠ ͍ͯ·͢ɻ

Slide 8

Slide 8 text

ςʔϒϧΛ࡞੒͠Α͏ • ECCUBEROOT/src/Eccube/Resource/doctrine ௚Լʹ
 Eccube.Entity.Study.dcm.yml
 ϑΝΠϧΛ࡞੒͠·͢ɻ • dcm.ymlϑΝΠϧΛ࡞੒ޙɺEntityΫϥεΛdoctrineί ϚϯυΛ࢖ͬͯ࡞੒͠·͢ɻ(શͯ1ߦͰهड़)
 vendor/bin/doctrine orm:generate:entities --extend="Eccube \\Entity\\AbstractEntity" src

Slide 9

Slide 9 text

ςʔϒϧΛ࡞੒͠Α͏ • Eccube.Entity.Study.dcm.ymlͷ಺༰
 Eccube\Entity\Study: type: entity table: dtb_study repositoryClass: Eccube\Repository\StudyRepository id: id: type: integer nullable: false id: true column: study_id generator: strategy: AUTO options: unsigned: true fields: name: type: string length: 100 url: type: string nullable: true length: 200 create_date: type: datetime nullable: false update_date: type: datetime nullable: false lifecycleCallbacks: { }

Slide 10

Slide 10 text

ςʔϒϧΛ࡞੒͠Α͏ • EntityΫϥεΛ࡞੒ޙɺ࣮ࡍʹMySQL΍Postgresʹରͯ͠ςʔϒϧ Λ࡞੒͠·͢ɻ࡞੒ํ๏͸2௨Γ͋Γɺmigrationͱݺ͹ΕΔ࢓૊ ΈΛ࢖͏͔ɺdoctrineίϚϯυΛ࢖ͬͯςʔϒϧΛ࡞੒͢Δ͔ͷ2 ௨Γ͋Γ·͢ɻࠓճ͸͕࣌ؒͳ͍ͨΊdoctrineίϚϯυΛ࢖͏ํ๏ Λઆ໌͠·͢ɻ
 
 
 
 
 ɾDB΁ͷϚΠάϨʔγϣϯํ๏ vendor/bin/doctrine orm:schema-tool:update Λ࣮ߦͯ͠migrationՄೳ͔Ͳ͏͔Λ֬ೝ͢Δɻ vendor/bin/doctrine orm:schema-tool:update --dump-sql Λ࣮ߦͯ͠sqlΛ֬ೝ vendor/bin/doctrine orm:schema-tool:update --force Λ࣮ߦͯ͠DB΁ϚΠάϨʔγϣϯ

Slide 11

Slide 11 text

3.DoctrineΛ࢖ͬͨDBΞΫηε

Slide 12

Slide 12 text

DoctrineΛ࢖ͬͨDBΞΫηε • DBʹΞΫηε͢ΔͨΊʹ͸Repositoryͱݺ͹ΕΔΫϥεΛ࢖͍·͢ɻ • Repository͸ಛఆͷΫϥεͷΤϯςΟςΟͷݕࡧΛิॿ͢ΔͨΊ͚ͩͷ PHPΫϥεͰ͢ɻࢦఆ͞ΕͨΤϯςΟςΟΛऔಘ͢ΔͨΊʹRepository Λ࢖͍·͢ɻ • ymlϑΝΠϧʹrepositoryClass: Eccube\Repository\XXXXRepositoriͱ هड़͠ͳ͚Ε͹σϑΥϧτͰ͸Doctrine\ORM\EntityRepositoryΫϥε ͕ར༻͞Ε·͢ɻ
 
 
 Eccube\Entity\Product: type: entity table: dtb_product repositoryClass: Eccube\Repository\ProductRepository ← ͜ΕͰ͢

Slide 13

Slide 13 text

DoctrineΛ࢖ͬͨDBΞΫηε • EC-CUBE3Ͱ͸Repository͸ΤϯςΟςΟΫϥεຖʹରԠ͢Δ RepositoryΫϥεΛ༻ҙ͠ɺͦͷRepository͸ Doctrine\ORM\EntityRepositoryΫϥεΛܧঝͯ͠࡞੒͠·͢ɻ • RepositoryΛݺͼग़͢ͱ͖͸ɺ
 $app['orm.em']->getRepository('Eccube\Entity\XXXX')
 ͱ͢Δ͜ͱͰRepositoryΛݺͼग़͠ɺRepositoryΫϥε͕༻ҙ͍ͯ͠Δ ϝιουͰDBʹΞΫηε͠·͢ɻ • EC-CUBE3Ͱ͸RepositoryΫϥε͸શͯ$appʹDI͍ͯ͠·͢ɻ (ECCUBEROOT/src/Eccube/ServiceProvider/ EccubeServiceProvider.phpΛࢀর)

Slide 14

Slide 14 text

DoctrineΛ࢖ͬͨDBΞΫηε • EntityRepositoryΫϥεʹ͸ඪ४Ͱ༻ҙ͞Ε͍ͯΔศརͳϝ ιου͕͋Γ·͢ɻΑ͘࢖͏ϝιουʹ͸ҎԼͷ΋ͷ͕͋Γ ·͢ɻ find : ओΩʔΛݩʹݕࡧ݁ՌΛऔಘ findAll : શ݅औಘ findBy : ͋Δ৚݅Λݩʹݕࡧ findOneBy : ͋Δ৚݅Λݩʹݕࡧ͢Δ͕݁Ռ͸1݅ͷΈ • ΋ͬͱෳࡶͳ৚͕݅ඞཁͳ৔߹ɺ֤RepositoryΫϥεʹϝ ιουΛ௥Ճ͍ͯͩ͘͠͞ɻ

Slide 15

Slide 15 text

DoctrineΛ࢖ͬͨDBΞΫηε • findϝιου
 ݕࡧ݁Ռ͸ओΩʔʹ֘౰͢Δ1݅ͷΈͰɺRepositiryʹ ؔ܎͢ΔEntityΫϥε͕औಘͰ͖·͢ɻ
 $Product = $app['eccube.repository.product'] ->find($id);

Slide 16

Slide 16 text

DoctrineΛ࢖ͬͨDBΞΫηε • findAllϝιου
 ݕࡧ݁Ռ͸શ݅औಘ͞ΕɺEntityΫϥεͷ഑ྻ(array)͕ औಘͰ͖·͢ɻ
 $Products = $app['eccube.repository.product'] ->findAll();

Slide 17

Slide 17 text

DoctrineΛ࢖ͬͨDBΞΫηε • findByϝιου
 ࢦఆͨ͠ݕࡧ৚݅Λݩʹݕࡧ͠ɺ֘౰͢Δ৚݅ͷEntity Ϋϥεͷ഑ྻ(array)͕औಘͰ͖·͢ɻ
 $Products = $app['eccube.repository.product'] ->findBy( array( 'name' => 'hoge', 'xxxx' => 'yyyyy' ) );

Slide 18

Slide 18 text

DoctrineΛ࢖ͬͨDBΞΫηε • findOneByϝιου
 ࢦఆͨ͠ݕࡧ৚݅Λݩʹݕࡧ͠ɺ֘౰͢Δ৚݅ͷEntity Ϋϥε1݅ͷΈ͕औಘͰ͖·͢ɻ
 $Product = $app['eccube.repository.product'] ->findOneBy( array( 'name' => 'hoge', 'xxxx' => 'yyyyy' ) );

Slide 19

Slide 19 text

DoctrineΛ࢖ͬͨDBΞΫηε • ιʔτ৚݅
 findByɺfindOneByϝιου͸ݕࡧ৚݅ࢦఆҎ֎ʹιʔ τ৚݅΋ࢦఆͰ͖·͢ɻ
 $Products = $app['eccube.repository.product'] ->findBy( array('name' => 'hoge'), array('update_date' => 'DESC') );

Slide 20

Slide 20 text

DoctrineΛ࢖ͬͨDBΞΫηε • RepositoryΫϥεʹ༻ҙ͞Ε͍ͯΔfindϝιουͳͲΛ࢖͑͹جຊతͳΫΤϦͰ ͋Ε͹؆୯ʹDB͔Β஋Λऔಘ͢Δ͜ͱ͕ग़དྷ·͕ͨ͠ɺΑΓෳࡶͳΫΤϦ΋ѻ ͏͜ͱ͕Ͱ͖·͢ɻ • ΑΓෳࡶͳΫΤϦΛѻ͏৔߹ɺDQL(Doctrine Query Language) Λ࢖༻ͯ͠ॻ͘ ͜ͱ΋ՄೳͰ͢ɻDQL͸SQLͱࣅ͍ͯ·͕͢ɺςʔϒϧ(ྫ: product)ͷߦͰ͸ͳ ͯ͘ɺ1ͭҎ্ͷΤϯςΟςΟΫϥεΦϒδΣΫτ(ྫ: Product)ʹରͯ͠ΫΤϦ ͢Δͱ͍͏͜ͱΛ૝ఆ͠·͢ɻ • DoctrineͰΫΤϦ͢Δʹ͸2ͭͷબ୒ࢶ͕͋Γ·͢ɻ७ਮͳDoctrineΫΤϦΛॻ ͔͘ɺDoctrineͷQueryBuilderΛ࢖༻͢Δ͜ͱͰ͢ɻ
 
 http://docs.symfony.gr.jp/symfony2/book/doctrine.html#book-doctrine-queries

Slide 21

Slide 21 text

DoctrineΛ࢖ͬͨDBΞΫηε • DoctrineΫΤϦ͸SQLจʹඇৗʹΑ͘ࣅͨ಺༰Ͱهड़͢ Δ͜ͱ͕ՄೳͰ͢ɻ • SQLʹ׳Ε͍ͯͨ৔߹ɺDoctrineΫΤϦΛ࢖͑͹͙͢ʹ ѻ͏͜ͱ͕ՄೳͰ͢ɻ • DoctrineͷQueryBuilderΛ࢖͑͹ɺΦϒδΣΫτࢦ޲ ͳΠϯλʔϑΣʔεΛ࢖ͬͯهड़͢Δ͜ͱ͕ՄೳͰ͢ɻ • QueryBuilderΦϒδΣΫτ͸ɺΫΤϦΛ૊ΈཱͯΔͷ ʹඞཁͳϝιουશͯΛؚΜͰ͍·͢

Slide 22

Slide 22 text

DoctrineΛ࢖ͬͨDBΞΫηε • DoctrineΫΤϦͷྫ
 DoctrineΫΤϦΛ࢖͏ͱ΄΅SQLͱಉ༷ͷ಺༰Ͱهड़͕ ग़དྷ·͢ɻ
 $query = $app['eccube.repository.product'] ->createQuery( 'SELECT p FROM Eccube\Entity\Product p WHERE p.name = :name ORDER BY p.update_date DESC' ) ->setParameter('name', 'hoge'); $Products = $query->getResult();

Slide 23

Slide 23 text

DoctrineΛ࢖ͬͨDBΞΫηε • QueryBuilderͷྫ
 QueryBuilderΛ࢖͏ͱɺෳࡶͳ৚݅Λهड़͢Δ͜ͱ͕ ՄೳͰɺΫΤϦͰ૊ΈཱͯΔͷʹඞཁͳϝιου (whereɺorderByɺetc...)౳͕શͯ͋Γ·͢ɻ
 $query = $app['eccube.repository.product'] ->createQueryBuilder('p') ->where('p.name = :name') ->orderBy('p.update_date', 'DESC'); ->setParameter('name', 'hoge') ->getQuery(); $Products = $query->getResult();

Slide 24

Slide 24 text

4.EC-CUBE3ίʔυϦʔσΟϯά

Slide 25

Slide 25 text

EC-CUBE3ίʔυϦʔσΟϯά • AdminσΟϨΫτϦ௚Լʹ͸؅ཧը໘༻ίϯτϩʔ ϥʔ͕ଘࡏ σΟϨΫτϦ໊ ػೳ໊ AdminController ϩάΠϯը໘ɺ؅ཧը໘τοϓ Content ίϯςϯπ؅ཧ༻ Customer ձһ؅ཧ༻ Order ड஫؅ཧ༻ Product ঎඼؅ཧ༻ Setting جຊ৘ใઃఆɺγεςϜ৘ใઃఆ༻ Store ΦʔφʔζετΞ༻

Slide 26

Slide 26 text

EC-CUBE3ίʔυϦʔσΟϯά • Admin\Product\ProductController.phpͷίʔυϦʔσ Οϯά

Slide 27

Slide 27 text

5.࣭ٙԠ౴౳

Slide 28

Slide 28 text

։ൃ࣌ͷࢀߟϖʔδ • GitHubWiki
 https://github.com/EC-CUBE/ec-cube/wiki • GitHubPages
 http://ec-cube.github.io • Qiitaͷهࣄ
 http://qiita.com/tags/EC-CUBE3