ãããŸã§ã®ãšãããããŒãžãäœããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãåŠçããããšãããã«æ€èšããŠããŸãããããããªãã Web ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã®å€ãã¯ããŒã¿ã¢ãã«ã«äŸåããŠããŸããsymfony ã®ããã©ã«ãã®ã¢ãã«ã³ã³ããŒãã³ãã¯ãªããžã§ã¯ã/ãªã¬ãŒã·ã§ãã«ãããã³ã°ã®ã¬ã€ã€ãŒã«åºã¥ããŠããŸããsymfonyã«ã¯ãïŒã€ã®ã¡ãžã£ãŒãªPHP ORM: Propel ãš Doctrine ããã³ãã«ãããŠããŸããsymfony ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®éçºè ã¯ãªããžã§ã¯ããéããŠããŒã¿ããŒã¹ã«ä¿åãããããŒã¿ã«ã¢ã¯ã»ã¹ãããªããžã§ã¯ããéããŠãããä¿®æ£ããŸããããŒã¿ããŒã¹ã«çŽæ¥ãšãçµãããšã¯ãããŸããããã®ããšã«ãã£ãŠé«ãæœè±¡æ§ãšç§»æ€æ§ãç¶æãããŸãã
ãã®ç« ã§ã¯ããªããžã§ã¯ãã®ããŒã¿ã¢ãã«ãäœæããæ¹æ³ãšãPropel ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããŠä¿®æ£ããæ¹æ³ã説æããŸãããã㯠Propelã symfony ã«çµ±åãããŠããããšãå®èšŒããŸãã
ããŒã¿ããŒã¹ã¯ãªã¬ãŒã·ã§ãã«ã§ããäžæ¹ã§ PHP 5 ãš symfony ã¯ãªããžã§ã¯ãæåã§ãããªããžã§ã¯ãæåã®ã³ã³ããã¹ãã§ãã£ãšãå¹æçã«ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ããªããžã§ã¯ãããªã¬ãŒã·ã§ãã«ãªããžãã¯ã«å€æããã€ã³ã¿ãŒãã§ã€ã¹ãæ±ããããŸãã1ç« ã§èª¬æãããããã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãªããžã§ã¯ããªã¬ãŒã·ã§ãã«ãããã³ã° (ORM - Object-Relational Mapping) ãšåŒã°ããããŒã¿ã«ã¢ã¯ã»ã¹å¯èœã§ãªããžã§ã¯ãã®ç¯å²ã§ããžãã¹ã«ãŒã«ãç¶æãããªããžã§ã¯ãã§æ§æãããŸãã
ORM ã®äž»ãªå©ç¹ã¯åå©çšæ§ã§ããã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåãããç°ãªãã¢ããªã±ãŒã·ã§ã³ããã§ããããŒã¿ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºãããšãã§ããŸããORM ã¬ã€ã€ãŒã¯ããŒã¿ããžãã¯ãã«ãã»ã«åããŸããããšãã°ãè¡ãããæçš¿åæ°ãšãããã®æçš¿ãã©ãã ã人æ°ãªã®ããããšã«ãã©ãŒã©ã ã®ãŠãŒã¶ãŒã®è©äŸ¡ãèšç®ããæ¹æ³ã§ããããŒãžããã®ãããªãŠãŒã¶ãŒã®è©äŸ¡ã衚瀺ããå¿ èŠããããšããsymfony ã¯è©³çŽ°ãªèšç®ã«æ©ãããšãªãããŒã¿ã¢ãã«ã®ã¡ãœãããç°¡åã«åŒã³åºããŸããèšç®æ¹æ³ãããšã§å€ãã£ãå Žåãå¿ èŠãªã®ã¯ã¢ãã«ã®è©äŸ¡ã¡ãœãããä¿®æ£ããã ãã§ãã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®éšåã¯ãã®ãŸãŸã«ã§ããŸãã
ã¬ã³ãŒãã®ä»£ããã«ãªããžã§ã¯ãã䜿ããããŒãã«ã®ä»£ããã«ã¯ã©ã¹ã䜿ãããšã«ã¯å¥ã®å©ç¹ããããŸã: ãããã«ãã£ãŠæ°ããã¢ã¯ã»ãµãŒãããŒãã«ã®ã«ã©ã ã«ããªãããããããããªããªããžã§ã¯ãã«è¿œå ã§ããŸããclient
ãšããååã®ããŒãã«ãååšããããã first_name
ãš last_name
ãšãã2ã€ã®ãã£ãŒã«ããæã€å Žåã« Name
ã ããæ±ããããšãèããŸãããªããžã§ã¯ãæåã®äžçã«ãããŠããªã¹ã8-1ã®ããã«ãClient
ã¯ã©ã¹ã«æ°ããã¢ã¯ã»ãµãŒã¡ãœãããè¿œå ããããšãšåããããç°¡åã§ããã¢ããªã±ãŒã·ã§ã³ã®èŠ³ç¹ãããClient
ã¯ã©ã¹ã® FirstName
ãLastName
ãš Name
å±æ§ã®ããã ã®éãã¯ååšããŸãããã¯ã©ã¹èªèº«ãã©ã®å±æ§ãããŒã¿ããŒã¹ã®ã«ã©ã ã«å¯Ÿå¿ããã®ãã決å®ã§ããŸãã
ãªã¹ã8-1 - ã¢ã¯ã»ãµãŒã¯ã¢ãã«ã¯ã©ã¹ã®å®éã®ããŒãã«æ§é ãèŠãé ã
[php]
public function getName()
{
return $this->getFirstName().' '.$this->getLastName();
}
ç¹°ãè¿ããããã¹ãŠã®ããŒã¿ã¢ã¯ã»ã¹é¢æ°ãšããŒã¿ã®ããžãã¹ããžãã¯èªèº«ã¯ãã®ãããªãªããžã§ã¯ãã®ãªãã«ä¿ãããŸããItems
(ãªããžã§ã¯ã) ãæ〠ShoppingCart
ã¯ã©ã¹ãèããŠã¿ãŸãããã粟ç®ã®ããã«ã·ã§ããã³ã°ã«ãŒãã®åèšéé¡ãåŸãæ¹æ³ã¯ããªã¹ã8-2ã§ç€ºãããããã«ãå®éã®èšç®ãã«ãã»ã«åããã«ã¹ã¿ã ã¡ãœãããæžãããšã§ãã
ãªã¹ã8-2 - ã¢ã¯ã»ãµãŒã¯ããŒã¿ããžãã¯ãèŠãé ã
[php]
public function getTotal()
{
$total = 0;
foreach ($this->getItems() as $item)
{
$total += $item->getPrice() * $item->getQuantity();
}
return $total;
}
ããŒã¿ãšã¢ã¯ã»ã¹ã®æé ãèšãããšãã«èæ ®ãã¹ãå¥ã®éèŠãªç¹ããããŸã: ããŒã¿ããŒã¹ãã³ããŒã¯ç°ãªã SQL æ§æã®æ¹èšã䜿ããŸããã»ãã®ããŒã¿ããŒã¹ãããžã¡ã³ãã·ã¹ãã (DBMS) ã«åãæ¿ãããšä»¥åã® DBMS ã®ããã«èšèšãããSQLã¯ãšãªã®éšåãæžãçŽããªããã°ãªããŸãããããŒã¿ããŒã¹ããç¬ç«ããæ§æã䜿ãã¯ãšãªãäœãããµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã«å®éã® SQL ã®ç¿»èš³ãä»»ããŠããã°ãèŠçããšããªããã«ããŒã¿ããŒã¹ã®æ§æãåãæ¿ããããšãã§ããŸãããããããŒã¿ããŒã¹ã®æœè±¡åã¬ã€ã€ãŒã®ç®çã§ããããã«ãã£ãŠã¯ãšãªã«å¯ŸããŠç¹å®ã®æ§æã䜿ãããšã匷å¶ãããDBMS ã®åºææ©èœã«é©åã㊠SQL ã³ãŒããæé©åããæ±ãäœæ¥ãæšé²ãããŸãã
æœè±¡åã¬ã€ã€ãŒã®äž»ãªå©ç¹ã¯ç§»æ€æ§ã§ããããã«ãã£ãŠããããžã§ã¯ããªãã°ã§ããå¥ã®ããŒã¿ããŒã¹ã«åãæ¿ããããšãã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ãããã¿ã€ããè¿ éã«æžãå¿ èŠããããã顧客ãèªèº«ã®ããŒãºã«æé©ãªããŒã¿ããŒã¹ã·ã¹ãã ãã©ããªã®ãã決æããŠããªãå ŽåãèããŠã¿ãŸããããSQLite ã§ã¢ããªã±ãŒã·ã§ã³ã®éçºãå§ããããšãå¯èœã§ãããããšãã°ã顧客ã決æãããæºåãã§ãããšãã«ãMySQLãPostgreSQLããŸã㯠Oracle ã«åãæ¿ããŸããèšå®ãã¡ã€ã«ã®äžè¡ãå€æŽããã°ãã¢ããªã±ãŒã·ã§ã³ã¯åããŸãã
symfony 㯠Propel ã Doctrine ã ORM ãšããŠå©çšãããããã¯ããŒã¿ããŒã¹ã®æœè±¡åã®ããã« PDO (PHP Data Objects) ãå©çšããŸããããã2ã€ã®ãµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã¯ãäž¡æ¹ãšã Propel ãš Doctrine ã®éçºããŒã ã«ãã£ãŠéçºãããsymfony ã«ã·ãŒã ã¬ã¹ã«çµ±åãããŠããã®ã§ããããããã¬ãŒã ã¯ãŒã¯ã®äžéšãšããŠã¿ãªãããšãã§ããŸãããã®ç« ã§èª¬æããŸããããããã®æ§æãšèŠçŽã¯ã§ããããã symfony ã®ãã®ãšã¯ç°ãªããªãããã«æ¡çšãããŸããã
NOTE symfony ã®ãããžã§ã¯ãã«ãããŠããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯åãã¢ãã«ãå ±æããŸããããããããžã§ã¯ãã¬ãã«ã®èå¿ãªç¹: å ±éã®ããžãã¹ã«ãŒã«ã«äŸåããã¢ããªã±ãŒã·ã§ã³ãåç·šããããšã§ããã¢ãã«ãã¢ããªã±ãŒã·ã§ã³ããç¬ç«ããŠãããã¢ãã«ã®ãã¡ã€ã«ããããžã§ã¯ãã®ã«ãŒãã®
lib/model/
ãã£ã¬ã¯ããªã«ä¿åãããçç±ã§ãã
symfony ã䜿ãããŒã¿ãªããžã§ã¯ãã¢ãã«ãäœãããã«ãããŒã¿ããŒã¹ãæã€ãªã¬ãŒã·ã§ãã«ã¢ãã«ã¯ã©ããªãã®ã§ããªããžã§ã¯ãããŒã¿ã¢ãã«ã«ç¿»èš³ããå¿ èŠããããŸããORM ã¯ãããã³ã°ãè¡ãããã«ãªã¬ãŒã·ã§ãã«ã¢ãã«ã®èšè¿°ãå¿ èŠã§ãããããèšè¿°ãããã®ã¯ã¹ããŒã (schema) ãšåŒã°ããŸããã¹ããŒãã«ãããŠãéçºè ã¯ããŒãã«ããããã®ãªã¬ãŒã·ã§ã³ã·ããããšã«ã©ã ã®ç¹åŸŽãå®çŸ©ããŸãã
symfony ã®ã¹ããŒãæ§æ㯠YAML ãã©ãŒããããå©çšããŸããschema.yml
ãã¡ã€ã«ã¯ myproject/config/
ãã£ã¬ã¯ããªå
éšã«èšçœ®ããªããã°ãªããŸããã
NOTE symfony ã¯ãã®ç« ã®ããšã®ã»ãã«ãã "schema.yml ãè¶ããŠ: schema.xml" ã®ã»ãã·ã§ã³ã§èª¬æããã Propel ãã€ãã£ã㪠XML 圢åŒã®ã¹ããŒããç解ããããšã«ãªããŸãã
ããŒã¿ããŒã¹ã®æ§é ãã¹ããŒãã«ã©ã®ããã«å€æããŸããïŒå
·äœäŸã¯ç解ããããã®æè¯ã®æ¹æ³ã§ãã2ã€ã®ããŒãã«: blog_article
ãš blog_comment
ãæã€ããã°ã®ããŒã¿ããŒã¹ãæ³åããŠãã ãããããŒãã«ã®æ§é ã¯å³8-1ã§ç€ºãããŠããŸãã
å³8-1 - ããã°ã®ããŒã¿ããŒã¹ã®ããŒãã«æ§é
é¢é£ãã schema.yml
ãã¡ã€ã«ã¯ãªã¹ã8-3ã®ããã«ãªããŸãã
ãªã¹ã8-3 - schema.yml
ã®ãµã³ãã«
[yml]
propel:
blog_article:
_attributes: { phpName: Article }
id: ~
title: varchar(255)
content: longvarchar
created_at: ~
blog_comment:
_attributes: { phpName: Comment }
id: ~
blog_article_id: ~
author: varchar(255)
content: longvarchar
created_at: ~
ããŒã¿ããŒã¹èªèº« (blog
) ã®ååã schema.yml
ã«ç»å Žããªãããšã«æ³šç®ããŠãã ããã代ããã«ãããŒã¿ããŒã¹ã®å
容ã¯æ¥ç¶å (ãã®äŸã§ã¯ propel
) ã®äžã«èšè¿°ãããŸããããã¯å®éã®æ¥ç¶èšå®ã¯ã¢ããªã±ãŒã·ã§ã³ã皌åããŠããç°å¢ã«äŸåããå¯èœæ§ãããããã§ããããšãã°ãéçºç°å¢ã«ãããŠã¢ããªã±ãŒã·ã§ã³ã皌åããããšããéçºããŒã¿ããŒã¹ (ããšãã° blog_dev
) ã«ã¢ã¯ã»ã¹ããããšã«ãªããŸãããéçšã®ããŒã¿ããŒã¹ãåãã¹ããŒãã䜿ããŸããæ¥ç¶èšå®ã¯ databases.yml
ãã¡ã€ã«ã®ãªãã§æå®ãããŸãããã®ãã¡ã€ã«ã¯ãã®ç« ã®ããšã®ã»ãã®"ããŒã¿ããŒã¹ã®æ¥ç¶"ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸããã¹ããŒãã¯ãããŒã¿ããŒã¹ã®æœè±¡åãä¿ã€ããã«ã詳现ãªæ¥ç¶æ
å ±ã®èšå®ãåãããæ¥ç¶åã ããåããŸãã
schema.yml
ãã¡ã€ã«ã«ãããŠãæåã®ããŒã¯æ¥ç¶åãè¡šããŸããããã¯ãããŒãã«ãè€æ°æ ŒçŽããããšãã§ããŸããããããã®ããŒãã«ã¯ã«ã©ã ã®ã»ãããæã¡ãŸããYAML æ§æã«åŸããããŒã¯ã³ãã³ (:) ã§çµãããæ§é ã¯ã€ã³ãã³ã (1ã€ãè€æ°ã®ã¹ããŒã¹ããã ãã¿ãã¯ãªã) ãéããŠç€ºãããŸãã
ããŒãã«ã¯ phpName
(çæã¯ã©ã¹ã®åå) ãå«ããŠãç¹å¥ãªå±æ§ãæã€ããšãã§ããŸããphpName
ãããŒãã«ã«èšèŒãããŠããªãå Žåãsymfony ã¯ãã®ããŒãã«ããã£ã¡ã«ã±ãŒã¹ããŒãžã§ã³ã®ååã§äœããŸãã
TIP ãã£ã¡ã«ã±ãŒã¹ã®èŠçŽã«ããã°åèªããã¢ã³ããŒã¹ã³ã¢ããšãé€ããå éšã®åèªã®æåã®æåã倧æåã«ããŸãã
blog_article
ãšblog_comment
ã®ããã©ã«ãã®ãã£ã¡ã«ã±ãŒã¹ã®ããŒãžã§ã³ã¯BlogArticle
ãšBlogComment
ã§ãããã®èŠçŽåã¯é·ãåèªå éšã®å€§æåãã©ã¯ãã®ã³ãã«èŠããããšããç±æ¥ããŠããŸãã
ããŒãã«ã¯ã«ã©ã ãæ ŒçŽããŸããã«ã©ã ã®å€ã¯3ã€ã®ç°ãªãæ¹æ³ã§å®çŸ©ã§ããŸã:
-
äœãå®çŸ©ããŠããªãå Žå(YAMLäžã®
~
ã¯ãPHPã§ãããšããã®null
ã®ããšã§ã)ãsymfony ã¯ã«ã©ã ã®ååãšããã€ãã®èŠçŽã«ãããã£ãŠãã¹ããªå±æ§ãæšæž¬ããŸããã«ã©ã ã®ååãšèŠçŽã¯ãã®ç« ã®åŸã®ã»ãã«ãã"空ã®ã«ã©ã "ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸããããšãã°ããªã¹ã8-3ã«ããid
ã«ã©ã ã¯å®çŸ©ããå¿ èŠã¯ãããŸãããsymfony ã¯ãããããªãŒãã€ã³ã¯ãªã¡ã³ãã®æŽæ°åã§ãããŒãã«ã®äž»ããŒãšå®çŸ©ããŸããblog_comment
ããŒãã«ã®blog_article_id
ã¯blog_article
ããŒãã«ãžã®å€éšããŒãšããŠç解ãããŸã (_id
ã§çµããã«ã©ã ã¯å€éšããŒãšããŠèŠãªãããé¢é£ããããŒãã«ã¯ã«ã©ã åã®æåã®éšåã«ãããã£ãŠèªåçã«æ±ºå®ãããŸã)ãcreated_at
ãšããååã®ã«ã©ã ã¯èªåçã«timestamp
åã«èšå®ãããŸããããããã¹ãŠã®ã«ã©ã ã«å¯ŸããŠãåãæå®ããå¿ èŠã¯ãããŸããããããschema.yml
ãæžãããšããªãç°¡åã§ãããã®çç±ã®1ã€ã§ãã -
1ã€ã®å±æ§ã ããå®çŸ©ããå Žåãããã¯ã«ã©ã åã§ããsymfony ã¯éåžžã®ã«ã©ã åãç解ããŸã:
boolean
ãinteger
ãfloat
ãdate
ãvarchar(size)
ãlongvarchar
ãªã©ã§ã(ããšãã° MySQL ã§ã¯text
ã«å€æãããŸã)ã256æåãè¶ããããã¹ãã®å 容ã«é¢ããŠã¯ããµã€ãºãæããªãlongvarchar
å (MySQL ã§ã¯65KBãè¶ããããšã¯ã§ããŸãã) ã䜿ãå¿ èŠããããŸãã -
ã»ãã®ã«ã©ã å±æ§ãå®çŸ©ããå¿ èŠãããå Žå (ããã©ã«ãå€ãå¿ é ã®å€ãªã©)ãã«ã©ã å±æ§ã
key: value
ã®ã»ãããšããŠæžããŸãããã®ã¹ããŒãã®æ¡åŒµæ§æã¯ãã®ç« ã®ããšã®ã»ãã§èª¬æããŸãã
ã«ã©ã ã¯å€§æåã§å§ãŸãããŒãžã§ã³ã®åå (Id
ãTitle
ãContent
ãªã©) ã§ãã phpName
å±æ§ãæã¡ããããŠãã®å ŽåããªãŒããŒã©ã€ãããå¿
èŠã¯ãããŸããã
å°æ°ã®ããŒã¿ããŒã¹åºæã®æ§é ã®å®çŸ©ãšåæ§ã«ãããŒãã«ã¯æ瀺çãªå€éšããŒãšã€ã³ããã¯ã¹ãåããããšãã§ããŸãã詳ããåŠã¶ã«ã¯ãã®ç« ã®åŸã®ã»ãã«ãã"ã¹ããŒãã®æ¡åŒµæ§æ"ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ã¹ããŒã㯠ORM ã¬ã€ã€ãŒã®ã¢ãã«ã¯ã©ã¹ããã«ãããããã«äœ¿ãããŸããäœæ¥æéãç¯çŽããããã«ããããã®ã¯ã©ã¹ã¯ propel:build-model
ãšããååã®ã³ãã³ãã©ã€ã³ã¿ã¹ã¯ã«ãã£ãŠçæãããŸãã
$ php symfony propel:build-model
TIP ã¢ãã«ããã«ãããããšã§ãsymfony ãæ°ããçæãããã¢ãã«ãèŠã€ããããããã«ã
php symfony cc
㧠symfony ã®å éšãã£ãã·ã¥ãã¯ãªã¢ããããšããå¿ããªãã
ãã®ã³ãã³ããå
¥åããããšã§ãããžã§ã¯ãã® lib/model/om/
ãã£ã¬ã¯ããªã§ã¹ããŒãã®è§£æãšåºåºããŒã¿ã¢ãã«ã¯ã©ã¹ã®çæãå®è¡ãããŸã:
BaseArticle.php
BaseArticlePeer.php
BaseComment.php
BaseCommentPeer.php
ããã«ãå®éã®ããŒã¿ã¢ãã«ã¯ã©ã¹ã¯ lib/model/
ã®ãªãã«äœãããŸã:
Article.php
ArticlePeer.php
Comment.php
CommentPeer.php
2ã€ã®ããŒãã«ã ããå®çŸ©ããã®ã§ã8ã€ã®ãã¡ã€ã«ã§çµãããŸããééã£ãããšã¯äœããããŸããããããã€ãã®èª¬æãããå¿ èŠããããŸãã
2ã€ã®ããŒãžã§ã³ã®ããŒã¿ãªããžã§ã¯ãã2ã€ã®ç°ãªããã£ã¬ã¯ããªã«ä¿åããã®ã¯ãªãã§ããããïŒ
ããããã¢ãã«ã®ãªããžã§ã¯ãã«ã«ã¹ã¿ã ã¡ãœãããšããããã£ãè¿œå ããããšãå¿
èŠã«ãªããŸã (ãªã¹ã8-1ã® getName()
ã¡ãœãããèããŠãã ãã)ãããããããžã§ã¯ãã®éçºã§ã¯ãããŒãã«ãããã¯ã«ã©ã ãè¿œå ããããšã«ãªããŸããschema.yml
ãã¡ã€ã«ãå€æŽãããã³ã«ãpropel:build-model
ãæ°ãã«åŒã³åºããŠãªããžã§ã¯ãã¢ãã«ã¯ã©ã¹ãåçæããå¿
èŠããããŸããã«ã¹ã¿ã ã¡ãœãããå®éã«çæãããã¯ã©ã¹ã®ãªãã«æžãããŠãããšãããããããã¯ãããããçæãããããšã§åé€ãããŸãã
lib/model/om/
ãã£ã¬ã¯ããªã«ä¿åããã Base
ã¯ã©ã¹ã¯ã¹ããŒãããçŽæ¥çæããããã®ã§ããããããä¿®æ£ãã¹ãã§ã¯ãããŸããããã¹ãŠã®æ°ããã¢ãã«ã®ãã«ãã«ãã£ãŠãããã®ãã¡ã€ã«ãå®å
šã«åé€ãããããã§ãã
äžæ¹ã§ãlib/model/
ãã£ã¬ã¯ããªã®ãªãã«ä¿åããããã«ã¹ã¿ã ãªããžã§ã¯ãã¯ã©ã¹ã¯å®éã«ã¯ Base
ã¯ã©ã¹ãç¶æ¿ããŸããæ¢åã®ã¢ãã«ã§ propel:build-model
ã¿ã¹ã¯ãåŒã³åºããããšãããããã®ã¯ã©ã¹ã¯ä¿®æ£ãããŸãããã§ãã®ã§ãããã«ã¹ã¿ã ã¡ãœãããè¿œå ã§ããå Žæã§ãã
ãªã¹ã8-4㯠propel:build-model
ã¿ã¹ã¯ãæåã«åŒã³åºãããšãã«äœæãããã«ã¹ã¿ã ã¢ãã«ã¯ã©ã¹ã®äŸã瀺ããŠããŸãã
ãªã¹ã8-4 - ã¢ãã«ã¯ã©ã¹ã®ãã¡ã€ã«ã®ãµã³ãã« (lib/model/Article.php
)
[php]
class Article extends BaseArticle
{
}
ãã㯠BaseArticle
ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœãããç¶æ¿ããŸãããã¹ããŒãã®ä¿®æ£ããã¯åœ±é¿ãåããŸããã
åºåºã¯ã©ã¹ãæ¡åŒµããã«ã¹ã¿ã ã¯ã©ã¹ã®ã¡ã«ããºã ã«ãã£ãŠãããŒã¿ããŒã¹ã®æçµçãªãªã¬ãŒã·ã§ãã«ã¢ãã«ãç¥ããªããŠããã³ãŒããæžãå§ããããšãã§ããŸããé¢é£ãã¡ã€ã«ã®æ§é ã«ãã£ãŠã¢ãã«ã¯ã«ã¹ã¿ãã€ãºå¯èœã§çºå±æ§ã®ãããã®ã«ãªããŸãã
Article
ãš Comment
ã¯ããŒã¿ããŒã¹ã®ã¬ã³ãŒããè¡šããªããžã§ã¯ãã¯ã©ã¹ã§ãããããã¯ã¬ã³ãŒãã®ã«ã©ã ãšé¢é£ã¬ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããŸãããªã¹ã8-5ã§ç€ºãããäŸã®ããã«ããã®ããšã¯ Article
ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºãããšã§ãèšäºã®ã¿ã€ãã«ãç¥ãããšãã§ããããšãæå³ããŸãã
ãªã¹ã8-5 - ã¬ã³ãŒãã«ã©ã ã®ã²ãã¿ãŒã¯ãªããžã§ã¯ãã¯ã©ã¹ã®ãªãã§äœ¿ãã
[php]
$article = new Article();
// ...
$title = $article->getTitle();
ArticlePeer
ãš CommentPeer
ã¯å¯Ÿã®ã¯ã©ã¹ã§ã; ããªãã¡ãããŒãã«äžã§å®è¡ããã¹ã¿ãã£ãã¯ã¡ãœãããå«ãã¯ã©ã¹ã§ãããããã¯ããŒãã«ããã¬ã³ãŒããæ€çŽ¢ããæ¹æ³ãæäŸããŸãããªã¹ã8-6ã§ç€ºãããããã«ãéåžžãããã®ã¡ãœããã¯é¢é£ãªããžã§ã¯ãã¯ã©ã¹ã®ãªããžã§ã¯ããããã¯ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
ãªã¹ã8-6 -ãã¬ã³ãŒããæ€çŽ¢ããã¹ã¿ãã£ãã¯ã¡ãœããã¯å¯Ÿã®ã¯ã©ã¹ã®ãªãã§äœ¿ãã
[php]
// $articles 㯠Article ã¯ã©ã¹ã®ãªããžã§ã¯ãã®é
å
$articles = ArticlePeer::retrieveByPks(array(123, 124, 125));
NOTE ããŒã¿ã¢ãã«ã®èŠ³ç¹ãããè€æ°ã®å¯Ÿã®ãªããžã§ã¯ãã¯ååšã§ããŸããã察ã®ã¯ã©ã¹ã®ã¡ãœãããéåžžã®
->
(ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®åŒã³åºã) ã®ä»£ããã«::
(ã¹ã¿ãã£ãã¯ã¡ãœããã®åŒã³åºã) ã§åŒã³åºãããã®ã¯ããããããã§ãã
åºåºãšã«ã¹ã¿ã ããŒãžã§ã³ã®ãªããžã§ã¯ãã¯ã©ã¹ãšå¯Ÿã®ã¯ã©ã¹ãçµåããçµæã¯ã¹ããŒãã®ãªãã«èšè¿°ãããããŒãã«ããšã«çæããã4ã€ã®ã¯ã©ã¹ã«ãªããŸããå®éã«ã¯ã5çªç®ã®çæã¯ã©ã¹ã lib/model/map/
ãã£ã¬ã¯ããªã«ååšããŸãããã®ãã£ã¬ã¯ããªã¯å®è¡ç°å¢ã®ããã«å¿
èŠãªããŒãã«ã«ã€ããŠã®ã¡ã¿ããŒã¿æ
å ±ãå«ã¿ãŸããããããªããããããããã®ã¯ã©ã¹ãå€æŽããããšã¯ãªãã®ã§ãå¿ããŠãããŸããŸããã
symfony ã§ã¯ããªããžã§ã¯ããéããŠããŒã¿ã«ã¢ã¯ã»ã¹ããŸãããªã¬ãŒã·ã§ãã«ã¢ãã«ãšããŒã¿ãæ€çŽ¢ãå€æŽãã SQL ã䜿ãããšã«æ £ããŠãããããªããžã§ã¯ãã¢ãã«ã®ã¡ãœããã¯è€éã«èŠãããããããŸãããããããã²ãšãã³ããŒã¿ã¢ã¯ã»ã¹ã®ããã®ãªããžã§ã¯ãæåã®åãå³ããã°ããšãŠã奜ãã«ãªãããšã§ãããã
ãããæåã¯ãåãçšèªãå ±æããŠããããšã確èªããŠã¿ãŸãããããªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ãšãªããžã§ã¯ãããŒã¿ã¢ãã«ã¯äŒŒããããªæŠå¿µã䜿ããŸããããããã¯ãäºãã«ç¬èªã®åœåæ³ãæã¡ãŸã:
ãªã¬ãŒã·ã§ãã« | ãªããžã§ã¯ãæå |
---|---|
ããŒãã« | ã¯ã©ã¹ |
åãã¬ã³ãŒã | ãªããžã§ã¯ã |
ãã£ãŒã«ããã«ã©ã | ãããã㣠|
symfony ã¯ã¢ãã«ããã«ããããšããschema.yml
㧠å®çŸ©ãããããããã®ããŒãã«ããšã«1ã€ã®åºåºãªããžã§ã¯ãã¯ã©ã¹ãäœããŸããããããã®ã¯ã©ã¹ã¯ã«ã©ã å®çŸ©ãããšã«ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã¢ã¯ã»ãµãŒããã¥ãŒããŒã¿ãŒãåããŠããŸã: ãªã¹ã8-7ã§ç€ºãããããã«ãnew
ãgetXXX()
ãsetXXX()
ã¡ãœããã¯ãªããžã§ã¯ããäœããªããžã§ã¯ãã®ããããã£ã«ã¢ã¯ã»ã¹ããäœæ¥ãå©ããŸãã
ãªã¹ã8-7 - çæãªããžã§ã¯ãã¯ã©ã¹ã®ã¡ãœãã
[php]
$article = new Article();
$article->setTitle('åããŠã®èšäº');
$article->setContent("ããã¯åããŠã®èšäºã§ãã\n çæ§ã楜ããã§ãã ããããšãç¥ã£ãŠããŸãïŒ");
$title = $article->getTitle();
$content = $article->getContent();
NOTE çæãªããžã§ã¯ãã¯ã©ã¹ã¯
Article
ãšåŒã°ããblog_article
ããŒãã«ã«æž¡ãããphpName
ã§ããphpName
ãã¹ããŒãã§å®çŸ©ãããŠããªãå Žåãã¯ã©ã¹ã¯BlogArticle
ãšããååã«ãªããŸããã¢ã¯ã»ãµãŒãšãã¥ãŒããŒã¿ãŒã¯ãã£ã¡ã«ã±ãŒã¹åœ¢åŒã®ã«ã©ã åã䜿ãã®ã§ãgetTitle()
ã¡ãœããã¯title
ã«ã©ã ã®å€ãæ€çŽ¢ããŸãã
ãªã¹ã8-8ã§ç€ºãããããã«äžåºŠã«è€æ°ã®ãã£ãŒã«ããèšå®ããã«ã¯ãããããã®ãªããžã§ã¯ãã¯ã©ã¹ã«å¯ŸããŠçæãããã fromArray()
ã¡ãœããã䜿ããŸãã
ãªã¹ã8-8 - fromArray()
ã¡ãœããã¯è€æ°ã®ã»ãã¿ãŒã§ãã
[php]
$article->fromArray(array(
'title' => 'åããŠã®èšäº',
'content' => 'ããã¯åããŠã®èšäºã§ãã\n çæ§ã楜ããã§ãã ããããšãç¥ã£ãŠããŸãïŒ',
));
NOTE
fromArray()
ã¡ãœããã¯ç¬¬ïŒåŒæ°ã«keyType
ããšããŸãããããæå®ããããšã«ãã£ãŠãé åã®ããŒã«ã©ã®ãããªå€ãèšå®ããããæå®ã§ããŸããæå®ã§ããã¯ã©ã¹å®æ°ã¯ãBasePeer::TYPE_PHPNAME
ãBasePeer::TYPE_STUDLYPHPNAME
ãBasePeer::TYPE_COLNAME
ãBasePeer::TYPE_FIELDNAME
ãBasePeer::TYPE_NUM
ããããŸããããã©ã«ãã®ããŒã¿ã€ãã¯ã«ã©ã ã®PhpName(ããšãã°ãAuthorId
)ã§ãã
blog_comment
ããŒãã«ã® blog_article_id
ã«ã©ã ã¯æ瀺çã«å€éšããŒãblog_article
ããŒãã«ã«å®çŸ©ããŸããããããã®ã³ã¡ã³ãã¯1ã€ã®èšäºã«é¢é£ãã1ã€ã®èšäºã¯å€ãã®ã³ã¡ã³ããæã€ããšãã§ããŸããçæã¯ã©ã¹ã¯æ¬¡ã®ããã«ãã®ãªã¬ãŒã·ã§ã³ã·ããããªããžã§ã¯ãæåã®æ¹æ³ã«ç¿»èš³ãã5ã€ã®ã¡ãœãããåããŸã:
$comment->getArticle()
: é¢é£ããArticle
ãªããžã§ã¯ããååŸãã$comment->getArticleId()
: é¢é£ããArticle
ãªããžã§ã¯ãã® ID ãååŸãã$comment->setArticle($article)
: é¢é£ããArticle
ãªããžã§ã¯ããå®çŸ©ãã$comment->setArticleId($id)
: ID ããé¢é£ããArticle
ãªããžã§ã¯ããå®çŸ©ãã$article->getComments()
: é¢é£ããComment
ãªããžã§ã¯ããååŸãã
getArticleId()
ãš setArticleId()
ã¡ãœããã¯éçºè
ã blog_article_id
ã«ã©ã ãéåžžã®ã«ã©ã ãšã¿ãªããŠãªã¬ãŒã·ã§ã³ã·ãããæåã§èšå®ã§ããããšã瀺ããŸããããããããã¯ããŸãé¢çœããã®ã§ã¯ãããŸããããªããžã§ã¯ãæåã®ã¢ãããŒãã®å©ç¹ã¯ã»ãã®3ã€ã®ã¡ãœããã§ãããã«ããããã«ãªããŸãããªã¹ã8-9ã¯çæãããã»ãã¿ãŒã®äœ¿ãæ¹ã瀺ããŸãã
ãªã¹ã8-9 - å€éšããŒã¯ç¹å¥ãªã»ãã¿ãŒã«ç¿»èš³ããã
[php]
$comment = new Comment();
$comment->setAuthor('Steve');
$comment->setContent('ããïœãããããæåçã : æé«ã®èšäºã ãïŒ');
// ãã®ã³ã¡ã³ãã以åã® $article ãªããžã§ã¯ãã«å ãã
$comment->setArticle($article);
// 代æ¿æ§æã¯ãã§ã«ãªããžã§ã¯ããããŒã¿ããŒã¹ã«ä¿åãããŠããå Žåã®ã¿æå³ããªã
$comment->setArticleId($article->getId());
ãªã¹ã8-10ã¯çæãããã²ãã¿ãŒã®äœ¿ãæ¹ã瀺ããŠããŸããããã¯ã¢ãã«ãªããžã§ã¯ãã®ã¡ãœãããã§ãŒã³ã®äœ¿ãæ¹ã瀺ããŠããŸãã
ãªã¹ã8-10 - å€éšããŒã¯ç¹å¥ãªã²ãã¿ãŒã«ç¿»èš³ããã
[php]
// å€å¯Ÿäžã®ãªã¬ãŒã·ã§ã³ã·ãã
echo $comment->getArticle()->getTitle();
=> åããŠã®èšäº
echo $comment->getArticle()->getContent();
=> ããã¯åããŠã®èšäºã§ããçæ§ã楜ããã§ãã ããããšãç¥ã£ãŠããŸãïŒ
// äžå¯Ÿå€ã®ãªã¬ãŒã·ã§ã³ã·ãã
$comments = $article->getComments();
getArticle()
ã¡ãœãã㯠getTitle()
ã¢ã¯ã»ãµãŒããæ©æµãåãã Article
ã¯ã©ã¹ã®ãªããžã§ã¯ããè¿ããŸããããã¯éçºè
èªèº«ã JOIN ãè¡ããããåªããŠããã($comment->getArticleId()
ã®åŒã³åºãããå§ãŸã) ããããªè¡ã®ã³ãŒãããå¿
èŠãšããŸããã
ãªã¹ã8-10ã® $comments
å€æ°ã¯ Comment
ã¯ã©ã¹ã®ãªããžã§ã¯ãé
åãåããŸãã$comments[0]
ã§æåã®ãã®ã衚瀺ãããããã㯠foreach($comments as $comment)
ã«ããã³ã¬ã¯ã·ã§ã³ãéããŠç¹°ãè¿ãããšãã§ããŸãã
NOTE ã¢ãã«ããã®ãªããžã§ã¯ãã¯èŠçŽã«ãã£ãŠåæ°åœ¢ã®ååã§å®çŸ©ãããã®ã¯ãªããªã®ãããã§ç解ã§ããŸãã
blog_comment
ããŒãã«ã§å®çŸ©ãããå€éšããŒã«ãã£ãŠgetComments()
ã¡ãœãããäœãããŸããgetComments()
ã¡ãœããã®ååã¯Comment
ãªããžã§ã¯ãã®ååã«s
ãã€ã足ãããã®ã§ããã¢ãã«ãªããžã§ã¯ãã«è€æ°åœ¢ã®ååãã€ãããšãgetCommentss()
ãšåã¥ããããç¡æå³ãªã¡ãœãããçæãããããšã«ãªããŸãã
new
ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšã§ãæ°ãããªããžã§ã¯ããäœãããŸããããblog_article
ããŒãã«ã®ãªãã«ã¯å®éã®ã¬ã³ãŒããäœæãããŠããŸããããªããžã§ã¯ããä¿®æ£ããŠãããŒã¿ããŒã¹ã¯äœã圱é¿ãåããŸãããããŒã¿ãããŒã¿ããŒã¹ã«ä¿åããã«ã¯ããªããžã§ã¯ãã® save()
ã¡ãœãããåŒã³åºãå¿
èŠããããŸãã
[php]
$article->save();
ORM ã¯è³¢ãã®ã§ãªããžã§ã¯ãã®ããã ã®ãªã¬ãŒã·ã§ã³ã·ãããæ€åºãã$article
ãªããžã§ã¯ããä¿åããããšã§é¢é£ãã $comment
ãªããžã§ã¯ããä¿åãããŸããsymfony ã¯ä¿åããããªããžã§ã¯ããããŒã¿ããŒã¹ã®ãªãã«æ¢åã®å¯Ÿå¿éšåãæã€ããšãç¥ã£ãŠããã®ã§ãsave()
ã®åŒã³åºãã¯ãšãã©ã INSERT
ããã㯠UPDATE
ã«ãã£ãŠ SQL ã«ç¿»èš³ãããŸããäž»ããŒã¯ save()
ã¡ãœããã«ãã£ãŠèªåçã«èšå®ãããã®ã§ãä¿ååŸã«ãæ°ããäž»ããŒã $article->getId()
ã§æ€çŽ¢ã§ããŸãã
TIP
isNew()
ãåŒã³åºãããšã§ãªããžã§ã¯ããæ°ãããã©ããããã§ãã¯ã§ããŸããä¿®æ£ããããªããžã§ã¯ããä¿åãã¹ããã©ããå€æãã€ããªããã°ãisModified()
ã¡ãœãããåŒã³åºããŸãã
èšäºã®ã³ã¡ã³ããèªãå Žåãèšäºãã€ã³ã¿ãŒãããã«å
¬éããã®ãæ°ãå€ããããšããããŸããèšäºã®è©è«å®¶ã®ç®èãé¢çœããªãã®ã§ããã°ããªã¹ã8-11ã§ç€ºãããããã«ãdelete()
ã¡ãœããã§ã³ã¡ã³ããç°¡åã«åé€ã§ããŸãã
ãªã¹ã8-11 - é¢é£ãªããžã§ã¯ãã® delete()
ã¡ãœããã§ããŒã¿ããŒã¹ããã¬ã³ãŒããåé€ãã
[php]
foreach ($article->getComments() as $comment)
{
$comment->delete();
}
TIP
delete()
ã¡ãœãããåŒã³åºããããšã§ãããªã¯ãšã¹ããçµäºãããŸã§ãªããžã§ã¯ãã¯å©çšã§ããŸããããŒã¿ããŒã¹ã®ãªãã§ãªããžã§ã¯ããåé€ãããããšã確èªããã«ã¯ãisDeleted()
ã¡ãœãããåŒã³åºããŸãã
ç¹å®ã®ã¬ã³ãŒãã®äž»ããŒãç¥ã£ãŠããå Žåãé¢é£ãªããžã§ã¯ããæ€çŽ¢ããã«ã¯ãã¢ã¯ã©ã¹ã® retrieveByPk()
ã¯ã©ã¹ã¡ãœããã䜿ããŸãã
[php]
$article = ArticlePeer::retrieveByPk(7);
schema.yml
ãã¡ã€ã«ã¯ id
ãã£ãŒã«ãã blog_article
ã®äž»ããŒãšããŠå®çŸ©ããŸãããã®ã¹ããŒãã¡ã³ãã¯å®éã«ã¯id
ã7ã§ããèšäºãè¿ããŸããäž»ããŒã䜿ããŸããã®ã§ãããªãã¯1ã€ã®ã¬ã³ãŒãã ããè¿ãããããšãç¥ã£ãŠããŸã; $article
å€æ°ã¯ Article
ã¯ã©ã¹ã®ãªããžã§ã¯ããåããŸãã
å Žåã«ãã£ãŠã¯ãäž»ããŒãè€æ°ã®ã«ã©ã ã§æ§æãããŸãããã®ãããªå Žåã«ã¯ãretrieveByPK()
ã¡ãœããã¯è€æ°ã®ãã©ã¡ãŒã¿ãŒããšããäž»ããŒã®ã«ã©ã ããšã®ãã©ã¡ãŒã¿ãŒã¯1ã€ã§ãã
çæããã retrieveByPKs()
ã¡ãœãããåŒã³åºãããšã§ãäž»ããŒãããšã«è€æ°ã®ãªããžã§ã¯ããéžã¶ããšãã§ããŸããretireveByPKs()
ã¡ãœããã®å¿
é ãã©ã¡ãŒã¿ãŒã¯äž»ããŒã®é
åã§ãã
è€æ°ã®ã¬ã³ãŒããæ€çŽ¢ããããšããæ€çŽ¢ããããªããžã§ã¯ãã«å¯Ÿå¿ãã察ã®ã¯ã©ã¹ã® doSelect()
ã¡ãœãããåŒã³åºãå¿
èŠããããŸããããšãã°ãArticle
ã¯ã©ã¹ã®ãªããžã§ã¯ããæ€çŽ¢ããã«ã¯ãArticlePeer::doSelect()
ãåŒã³åºããŸãã
doSelect()
ã¡ãœããã®æåã®ãã©ã¡ãŒã¿ãŒã¯ Criteria
ã¯ã©ã¹ã®ãªããžã§ã¯ãã§ããCriteria
ã¯ã©ã¹ (ãåºæºã) ã¯ããŒã¿ããŒã¹æœè±¡åã®ããã«SQLãªãã§å®çŸ©ãããã·ã³ãã«ãªã¯ãšãªã®å®çŸ©ã¯ã©ã¹ã§ãã
空㮠Criteria
ã¯ãã¹ãŠã®ã¯ã©ã¹ã®ãªããžã§ã¯ããè¿ããŸããããšãã°ããªã¹ã8-12ã§ç€ºãããã³ãŒãã¯ãã¹ãŠã®èšäºãæ€çŽ¢ããŸãã
ãªã¹ã8-12 - 空㮠Criteria -- Criteria ãš doSelect()
ã§ã¬ã³ãŒããæ€çŽ¢ãã
[php]
$c = new Criteria();
$articles = ArticlePeer::doSelect($c);
// äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªã«ãªããŸã
SELECT blog_article.ID, blog_article.TITLE, blog_article.CONTENT,
blog_article.CREATED_AT
FROM blog_article;
SIDEBAR ãã€ãã¬ã€ãã£ã³ã° (hydrating)
::doSelect()
åŒã³åºãã¯å®éã«ã¯ã·ã³ãã«ãªSQLã¯ãšãªããã¯ããã«åŒ·åã§ããæåã«ãSQL ã¯éžæãã DBMS ã®ããã«æé©åãããŸãã2çªç®ã«ãCriteria
ã«æž¡ãããã©ã®å€ãSQLã³ãŒãã«çµ±åãããåã«ãšã¹ã±ãŒããããSQL ã€ã³ãžã§ã¯ã·ã§ã³ã®ãªã¹ã¯ãäºé²ãããŸãã3çªç®ã«ãã¡ãœããã¯ãçµæã»ããã§ã¯ãªãããªããžã§ã¯ãé åãè¿ããŸããORM ã¯ããŒã¿ããŒã¹ã®çµæã»ãããããšã«ãªããžã§ã¯ããèªåçã«äœæãæå ¥ããŸãããã®ããã»ã¹ã¯ãã€ãã¬ã€ãã£ã³ã° (hydrating) ãšåŒã°ããŸãã
ããè€éãªãªããžã§ã¯ããéžã¶ã«ã¯ãWHERE
ãORDER BY
ãGROUP BY
ãããã³ã»ãã®SQLã¹ããŒãã¡ã³ããšåçã®ãã®ãå¿
èŠã§ããCriteria
ãªããžã§ã¯ãã¯ããããã¹ãŠã®æ¡ä»¶ã®ããã®ã¡ãœãããšãã©ã¡ãŒã¿ãŒãæã¡ãŸããããšãã°ããªã¹ã8-13ã®ããã«ãSteve ã«ãã£ãŠæžãããæ¥ä»é ã«äžŠã¹æ¿ããããããã¹ãŠã®ã³ã¡ã³ããååŸããã«ã¯ãCriteria
ããã«ãããŸãã
ãªã¹ã8-13 - Criteria
ãš doSelect()
ãšã¬ã³ãŒããæ€çŽ¢ãã -- æ¡ä»¶ã€ã Criteria
[php]
$c = new Criteria();
$c->add(CommentPeer::AUTHOR, 'Steve');
$c->addAscendingOrderByColumn(CommentPeer::CREATED_AT);
$comments = CommentPeer::doSelect($c);
// äžèšã®ã³ãŒãã¯æ¬¡ã®ãã㪠SQL ã¯ãšãªã«ãªã
SELECT blog_comment.ARTICLE_ID, blog_comment.AUTHOR, blog_comment.CONTENT,
blog_comment.CREATED_AT
FROM blog_comment
WHERE blog_comment.author = 'Steve'
ORDER BY blog_comment.CREATED_AT ASC;
add()
ã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã¯ã©ã¹ã®å®æ°ã¯ããããã£åãåç
§ããŸãããããã®å®æ°ã¯ã«ã©ã åã®å€§æåããŒãžã§ã³ããååãã€ããããŸããããšãã°ãblog_article
ããŒãã«ã® content
ã«ã©ã ãæ±ãã«ã¯ãArticlePeer::CONTENT
ã¯ã©ã¹å®æ°ã䜿ããŸãã
NOTE ãªã
blog_comment.AUTHOR
ã®ä»£ããã«CommentPeer::AUTHOR
ã䜿ãã®ãïŒ SQL ã¯ãšãªã«åºåãããæ¹æ³ã¯ã©ã¡ããªã®ãïŒããŒã¿ããŒã¹ã®author
ãã£ãŒã«ãã®ååãcontributor
ã«å€æŽããå¿ èŠãããå ŽåãèããŠã¿ãŸããããblog_comment.AUTHOR
ã䜿ãå Žåãã¢ãã«äžã®ãã¹ãŠã®åŒã³åºããå€æŽããªããã°ãªããŸãããäžæ¹ã§ãCommentPeer::AUTHOR
ã䜿ãå Žåãå¿ èŠãªã®ã¯schema.yml
ã®ã«ã©ã åãå€æŽããphpName
ãAUTHOR
ãšããŠä¿åããã¢ãã«ããªãã«ãããããšã ãã§ãã
ããŒãã«8-1㯠SQL ãš Criteria
ãªããžã§ã¯ãã®æ§æãæ¯èŒããŸãã
ããŒãã«8-1 - SQL ãš Criteria
ãªããžã§ã¯ãã®æ§æ
SQL | Criteria |
---|---|
WHERE column = value |
->add(column, value); |
WHERE column <> value |
->add(column, value, Criteria::NOT_EQUAL); |
ã»ãã®æ¯èŒæŒç®å | |
> , < |
Criteria::GREATER_THAN, Criteria::LESS_THAN |
>=, <= |
Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL |
IS NULL, IS NOT NULL |
Criteria::ISNULL, Criteria::ISNOTNULL |
LIKE, ILIKE |
Criteria::LIKE, Criteria::ILIKE |
IN, NOT IN |
Criteria::IN, Criteria::NOT_IN |
ã»ãã®SQLããŒã¯ãŒã | |
ORDER BY column ASC |
->addAscendingOrderByColumn(column); |
ORDER BY column DESC |
->addDescendingOrderByColumn(column); |
LIMIT limit |
->setLimit(limit) |
OFFSET offset |
->setOffset(offset) |
FROM table1, table2 WHERE table1.col1 = table2.col2 |
->addJoin(col1, col2) |
FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::LEFT_JOIN) |
FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::RIGHT_JOIN) |
TIP çæã¯ã©ã¹ã§å©çšå¯èœãªã¡ãœãããã©ããªã®ãèŠã€ããŠç解ããããã®ãã¹ãã®æ¹æ³ã¯ãçæåŸã«
lib/model/om/
ãã©ã«ããŒã®Base
ãã¡ã€ã«ãèŠãããšã§ããã¡ãœããã®ååã¯ãšãŠãããããããã§ããããããã«é¢ãã詳现ãªã³ã¡ã³ããå¿ èŠãªå Žåãconfig/propel.ini
ãã¡ã€ã«ã®propel.builder.addComments
ãã©ã¡ãŒã¿ãŒãtrue
ã«ã»ããããŠãã¢ãã«ããªãã«ãããŸãã
ãªã¹ã8-14ã¯è€æ°ã®æ¡ä»¶ã€ãã® Criteria
ã®ã»ãã®äŸã瀺ããŸããæ¥ä»é ã«äžŠã¹æ¿ãããã "enjoy" ã®åèªãå«ãèšäºã® Steve ã«ãããã¹ãŠã®ã³ã¡ã³ããæ€çŽ¢ããã
ãªã¹ã8-14 - Criteria
ãš doSelect()
ã§ã¬ã³ãŒããæ€çŽ¢ããå¥ã®äŸ-- æ¡ä»¶ã€ã Criteria
[php]
$c = new Criteria();
$c->add(CommentPeer::AUTHOR, 'Steve');
$c->addJoin(CommentPeer::ARTICLE_ID, ArticlePeer::ID);
$c->add(ArticlePeer::CONTENT, '%enjoy%', Criteria::LIKE);
$c->addAscendingOrderByColumn(CommentPeer::CREATED_AT);
$comments = CommentPeer::doSelect($c);
// äžèšã®ã³ãŒãã¯æ¬¡ã®ãããªSQLã¯ãšãªã«ãªã
SELECT blog_comment.ID, blog_comment.ARTICLE_ID, blog_comment.AUTHOR,
blog_comment.CONTENT, blog_comment.CREATED_AT
FROM blog_comment, blog_article
WHERE blog_comment.AUTHOR = 'Steve'
AND blog_article.CONTENT LIKE '%enjoy%'
AND blog_comment.ARTICLE_ID = blog_article.ID
ORDER BY blog_comment.CREATED_AT ASC
SQL ã¯ãšãŠãè€éãªã¯ãšãªãéçºã§ããã·ã³ãã«ãªèšèªãªã®ã§ãCriteria
ãªããžã§ã¯ãã¯ã©ããªè€éãªã¬ãã«ã®æ¡ä»¶ãåŠçã§ããŸããããããå€ãã®éçºè
ã¯æ¡ä»¶ããªããžã§ã¯ãæåã®ããžãã¯ã«ç¿»èš³ããåã«æåã« SQL ãèããã®ã§ãæåã« Criteria
ãææ¡ããã®ã¯é£ããã§ãããããããç解ããæè¯ã®æ¹æ³ã¯å
·äœäŸãšãµã³ãã«ã®ã¢ããªã±ãŒã·ã§ã³ããåŠã¶ããšã§ããããšãã°ã symfony å
¬åŒãµã€ãã¯å€ãã®æ¹æ³ã§ããªããåçºãã Criteria
ã®éçºäŸã§æºããããŠããŸãã
doSelect()
ã¡ãœããã«å ããŠããã¹ãŠã®å¯Ÿã®ã¯ã©ã¹ã¯ doCount()
ã¡ãœãããæã¡ãŸããdoCount()
ã¡ãœããã¯ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããåºæºãæºããã¬ã³ãŒãã®æ°ããã®ãŸãŸã«ãŠã³ãããŠãã«ãŠã³ãæ°ãæŽæ°ãšããŠè¿ããŸãããã®å Žåãè¿ããªããžã§ã¯ããååšããªãã®ã§ããã€ãã¬ã€ãã£ã³ã°ã¯è¡ãããŸããããŸã doCount()
ã¡ãœãã㯠doSelect()
ãããéãã§ãã
察ã®ã¯ã©ã¹ã¯ Criteria
ãå¿
é ãã©ã¡ãŒã¿ãŒãšãã doDelete()
ãdoInsert()
ãš doUpdate()
ã¡ãœãããæäŸããŸãããããã®ã¡ãœããã«ãã£ãŠããŒã¿ããŒã¹ã« DELETE
ãINSERT
ãš UPDATE
ã¯ãšãªãçºè¡ã§ããŸãããããã® Propel ã®ã¡ãœããã®è©³çŽ°ã«é¢ããŠã¯çæã¢ãã«ã®ãã¢ã¯ã©ã¹ã確èªããŠãã ããã
æåŸã«ãæåã«è¿ããããªããžã§ã¯ãã欲ããå ŽåãdoSelect()
ããã¹ãŠ doSelectOne()
ã®åŒã³åºãã«çœ®ãæããŸãããã㯠Criteria
ã1ã€ã®çµæã ããè¿ãããšãç¥ã£ãŠãããšãã«ããŠã¯ãŸãå Žåã§ãå©ç¹ã¯ãã®ã¡ãœããããªããžã§ã¯ãé
åã§ã¯ãªããªããžã§ã¯ããè¿ãããšã§ãã
TIP
doSelect()
ã¯ãšãªãå€æ°ã®çµæãè¿ããšããã¬ã¹ãã³ã¹ã®ãªãã§ãã®éšåéåã ãã衚瀺ãããããšããããŸããsymfony ã¯çµæã®ããŒãžåå²ãèªååããsfPropelPager
ãšåŒã°ããããŒãžã£ãŒã¯ã©ã¹ãæäŸããŸãã
ãšãã«ã¯ããªããžã§ã¯ããæ€çŽ¢ããå¿ èŠã¯ãªãããããŒã¿ããŒã¹ã«ãã£ãŠç®åºãããç·åçµæã ãã欲ããããšããããŸããããšãã°ããã¹ãŠã®èšäºäœæã®ææ°æ¥æãååŸããããã«ããã¹ãŠã®èšäºãæ€çŽ¢ããé åã§ã«ãŒãããŠãç¡æå³ã§ããçµæã ããè¿ãããã«ããŒã¿ããŒã¹ã«æ±ããã»ããæãŸããã§ãããªããªããããã¯ãªããžã§ã¯ãã®ãã€ãã¬ã€ãã£ã³ã°ãã¹ãããããããã§ãã
äžæ¹ã§ãããŒã¿ããŒã¹æœè±¡åã®å©ç¹ã倱ããããªãã®ã§ãããŒã¿ããŒã¹ç®¡çã®ããã« PHP ã³ãã³ããçŽæ¥åŒã³åºããããªãããšããããŸãããã㯠ORM (Propel) ãåé¿ããããŒã¿ããŒã¹ã®æœè±¡å (PDO) ãåé¿ããªãããšãå¿ èŠã§ããããšãæå³ããŸãã
PDO ã§ããŒã¿ããŒã¹ã«ã¯ãšãªãè¡ãã«ã¯æ¬¡ã®äœæ¥ãè¡ãå¿ èŠããããŸã:
- ããŒã¿ããŒã¹ã®æ¥ç¶ãååŸããã
- ã¯ãšãªã®æååããã«ãããã
- ããããã¹ããŒãã¡ã³ããäœãã
- ã¹ããŒãã¡ã³ãã®å®è¡ããåŸãããçµæã»ãããã€ãã¬ãŒãããã
äœãèšã£ãŠããã®ãããããããªãã®ã§ãããããããããªã¹ã8-15ã®ã³ãŒããèŠãã°ããæ確ã«ãªãã§ãããã
ãªã¹ã8-15 - PDO ã§ã«ã¹ã¿ã SQL ã¯ãšãª
[php]
$connection = Propel::getConnection();
$query = 'SELECT MAX(?) AS max FROM ?';
$statement->bindValue(1, ArticlePeer::CREATED_AT);
$statement->bindValue(2, ArticlePeer::TABLE_NAME);
$statement = $connection->prepare($query);
$statement->execute();
$resultset = $statement->fetch(PDO::FETCH_OBJ);
$max = $resultset->max;
Propel ã® SELECT æ©èœãšåãããã«ãPDO ã¯ãšãªã䜿ãå§ãããšããããã¯æ±ãã«ããã§ããç¹°ãè¿ããŸãããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ãšãã¥ãŒããªã¢ã«ã®äŸã¯æ£ããæ¹æ³ã瀺ããŸãã
CAUTION ãã®ããã»ã¹ãåé¿ãããŒã¿ããŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ããå ŽåãPropel ã«ãã£ãŠæäŸãããã»ãã¥ãªãã£ãšæœè±¡åã倱ããªã¹ã¯ãè² ãããšã«ãªããŸããPropel ã®ããããã¯é·ãã§ãããããã©ãŒãã³ã¹ãããŒã¿ããªãã£ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ãä¿èšŒããããç¿æ £ã匷å¶ãããŸããããã¯ä¿¡çšã§ããªããœãŒã¹ (ããšãã°ã€ã³ã¿ãŒãããã®ãŠãŒã¶ãŒ) ããã®ãã©ã¡ãŒã¿ãŒãåããã¯ãšãªã«ãšãããããŠã¯ãŸããŸããPropel ã¯å¿ èŠãªãã¹ãŠã®ãšã¹ã±ãŒããè¡ããããŒã¿ããŒã¹ãå®å šã«ããŸããããŒã¿ããŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ SQL ã€ã³ãžã§ã¯ã·ã§ã³æ»æã®ãªã¹ã¯ãååšããç¶æ ã«ãããããããšãæå³ããŸãã
éåžžãããŒãã«ã« created_at
ãšåŒã°ããã«ã©ã ããããšããã¬ã³ãŒãã®äœææ¥æã®ã¿ã€ã ã¹ã¿ã³ããä¿åããããã«ãã®ã«ã©ã ã¯äœ¿ãããŸããåãããšã updated_at
ã«ã©ã ã«ãããŠã¯ãŸããŸããã¬ã³ãŒãèªèº«ãæŽæ°ããããã³ã«çŸåšã®æéã®å€ã«æŽæ°ãããŸãã
ããç¥ãã㯠symfony ããããã®ã«ã©ã ãèªèãæŽæ°ãåŠçããããšã§ããcreated_at
ã«ã©ã ãš updated_at
ã«ã©ã ãæåã§èšå®ããå¿
èŠã¯ãããŸãã; ãªã¹ã8-16ã§ç€ºãããããã«ããããã¯èªåçã«æŽæ°ãããŸããåãããšã created_on
ãš updated_on
ã«ã©ã ã«ãããŠã¯ãŸããŸãã
ãªã¹ã8-16 - created_at
ãš updated_at
ã«ã©ã ã¯èªåçã«åŠçããã
[php]
$comment = new Comment();
$comment->setAuthor('Steve');
$comment->save();
// äœææç¹ã®æ¥ä»ã衚瀺ãã
echo $comment->getCreatedAt();
=> [date of the database INSERT operation]
å ããŠãæ¥ä»ã«ã©ã ã®ã²ãã¿ãŒã¯åŒæ°ãšããŠæ¥ä»ãã©ãŒããããåããšããŸã:
[php]
echo $comment->getCreatedAt('Y-m-d');
SIDEBAR ããŒã¿ã¬ã€ã€ãŒãžã®ãªãã¡ã¯ã¿ãªã³ã°
symfony ãéçºããŠãããšããã¢ã¯ã·ã§ã³ã®ãã¡ã€ã³ããžãã¯ã®ã³ãŒããæžãå§ããããšããããããŸããããããªããããŒã¿ããŒã¹ã¯ãšãªãšã¢ãã«æäœã®ã³ãŒãã¯ã³ã³ãããŒã©ãŒã¬ã€ã€ãŒã«ä¿åãã¹ãã§ã¯ãªããããŒã¿ã«é¢é£ãããã¹ãŠã®ããžãã¯ã¯ã¢ãã«ã¬ã€ã€ãŒã«ç§»åãããã¹ãã§ããã¢ã¯ã·ã§ã³ã®è€æ°ã®å Žæã§åããªã¯ãšã¹ããè¡ãå¿ èŠããããšãã¯ãé¢é£ã³ãŒããã¢ãã«ã«ç§»åãããããšãèããŠãã ããããã®äœæ¥ãè¡ãããšã§ã¢ã¯ã·ã§ã³ã®ã³ãŒããçããŠèªã¿ãããç¶æ ã«ä¿ã€ããã®å©ãã«ãªããŸãã
ããšãã°ãããã°ã§ (ãªã¯ãšã¹ããã©ã¡ãŒã¿ãŒãšããŠæž¡ããã) ä»»æã®ã¿ã°ã«å¯ŸããŠãã£ãšã人æ°ã®ããèšäºãæ€çŽ¢ããããã«å¿ èŠãªã³ãŒããæ³åããŠãã ããããã®ã³ãŒãã¯ã¢ã¯ã·ã§ã³ã§ã¯ãªãã¢ãã«ã®ãªãã«ååšããŸããå®éããã³ãã¬ãŒãã®ãªãã§ãã®èšäºã®äžèŠ§ã衚瀺ããå¿ èŠãããå Žåãã¢ã¯ã·ã§ã³ã¯æ¬¡ã®ãããªã·ã³ãã«ãªãã®ã«ãªããŸã:
[php] public function executeShowPopularArticlesForTag($request) { $tag = TagPeer::retrieveByName($request->getParameter('tag')); $this->forward404Unless($tag); $this->articles = $tag->getPopularArticles(10); }
ã¢ã¯ã·ã§ã³ã¯ãªã¯ãšã¹ããã©ã¡ãŒã¿ãŒãã
Tag
ã¯ã©ã¹ã®ãªããžã§ã¯ããäœããŸããããããããŒã¿ããŒã¹ã«ã¯ãšãªãè¡ãããã«å¿ èŠãªãã¹ãŠã®ã³ãŒãã¯ãã®ã¯ã©ã¹ã®getPopularArticles()
ã¡ãœããã«èšçœ®ãããŸããããã«ãã£ãŠã¢ã¯ã·ã§ã³ã¯èªã¿ããããªããã¢ãã«ã®ã³ãŒãã¯å¥ã®ã¢ã¯ã·ã§ã³ã®ãªãã§ç°¡åã«åå©çšã§ããŸããã³ãŒããããé©åãªå Žæã«ç§»åãããããšã¯ãªãã¡ã¯ã¿ãªã³ã°ã®æè¡ã®1ã€ã§ããé »ç¹ã«ãã®äœæ¥ãè¡ãã°ãã³ãŒãã¯ç¶æããããã»ãã®éçºè ã«ãããããããªããŸããããŒã¿ã¬ã€ã€ãŒã§ãªãã¡ã¯ã¿ãªã³ã°ãè¡ããšãã®ããçµéšåã¯ã¢ã¯ã·ã§ã³ã®ã³ãŒãã«å«ãŸãã PHP ã³ãŒãã®ã»ãšãã©ã10è¡ãè¶ããªãããšã§ãã
ããŒã¿ã¢ãã«ã¯å©çšãããããŒã¿ããŒã¹ããç¬ç«ããŠããŸãããééããªãããŒã¿ããŒã¹ã䜿ãããšã«ãªããŸãããªã¯ãšã¹ãããããžã§ã¯ãã®ããŒã¿ããŒã¹ã«éä¿¡ããããã« symfony ã«æ±ããããæå°éã®æ
å ±ã¯ååãã¯ã¬ãã³ã·ã£ã«ããšããŒã¿ããŒã¹ã®çš®é¡ã§ãããããã®æ¥ç¶èšå®ã¯ configure:database
ã¿ã¹ã¯ã«ããŒã¿ãœãŒã¹å (DSN - Data Source Name) ãæž¡ãããšã§èšå®å¯èœã§ã:
$ php symfony configure:database "mysql:host=localhost;dbname=blog" root mYsEcret
æ¥ç¶èšå®ã¯ç°å¢ã«äŸåããŸããã¢ããªã±ãŒã·ã§ã³ã® prod
ãdev
ããš test
ç°å¢ããã㯠env
ãªãã·ã§ã³ã䜿ã£ãŠå¥ã®ç°å¢ã«å¯ŸããŠç°ãªãèšå®ãå®çŸ©ã§ããŸã:
$ php symfony configure:database --env=dev "mysql:host=localhost;dbname=blog_dev" root mYsEcret
ãã®èšå®ã¯ã¢ããªã±ãŒã·ã§ã³ããšã«ãªãŒããŒã©ã€ãããããšãã§ããŸããããšãã°ãããã³ããšã³ããšããã¯ãšã³ãã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠç°ãªãã»ãã¥ãªãã£ããªã·ãŒãé©çšããããŒã¿ããŒã¹ãæ±ãããã«1ã€ã®ããŒã¿ããŒã¹ã®ãªãã§ç°ãªãæš©éãæã€è€æ°ã®ããŒã¿ããŒã¹ãŠãŒã¶ãŒãå®çŸ©ããããã«ããã®ã¢ãããŒããå©çšã§ããŸã:
$ php symfony configure:database --app=frontend "mysql:host=localhost;dbname=blog" root mYsEcret
ç°å¢ããšã«è€æ°ã®æ¥ç¶ãå®çŸ©ã§ããŸããããããã®æ¥ç¶ã¯åãååã§ã©ãã«ã¥ããããã¹ããŒããåç
§ããŸããããã©ã«ãã§äœ¿ãããæ¥ç¶å㯠propel
ã§ããã¯ãªã¹ã8-3ã® propel
ã¹ããŒããåç
§ããŸããname
ãªãã·ã§ã³ã«ãã£ãŠå¥ã®æ¥ç¶ãäœæããããšãã§ããŸã:
$ php symfony configure:database --name=main "mysql:host=localhost;dbname=example" root mYsEcret
config/
ãã£ã¬ã¯ããªã«èšçœ®ããã databases.yml
ãã¡ã€ã«ã®ãªãã§ãããã®æ¥ç¶èšå®ãæåã§å
¥åããããšãã§ããŸãããªã¹ã8-17ã¯ãã¡ã€ã«ã®äŸã瀺ããªã¹ã8-18ã¯æ¡åŒµèšæ³ã«ããåãäŸã瀺ããŸãã
ãªã¹ã8-17 - ããŒã¿ããŒã¹æ¥ç¶èšå®ã®çç¥èšæ³
[yml]
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://login:passwd@localhost/blog
ãªã¹ã8-18 - ããŒã¿ããŒã¹æ¥ç¶èšå®ã®ãµã³ãã« (myproject/config/databases.yml
)
[yml]
prod:
propel:
param:
hostspec: mydataserver
username: myusername
password: xxxxxxxxxx
all:
propel:
class: sfPropelDatabase
param:
phptype: mysql # ããŒã¿ããŒã¹ãã³ããŒ
hostspec: localhost
database: blog
username: login
password: passwd
port: 80
encoding: utf8 # ããŒãã«äœæã®ããã®ããã©ã«ãã®æåéå
persistent: true # æ°žç¶çæ¥ç¶ã䜿ã
èªãããã phptype
ãã©ã¡ãŒã¿ãŒã®å€ã¯ PDO ã«ãã£ãŠãµããŒããããããŒã¿ããŒã¹ã·ã¹ãã ã®1ã€ã§ã:
mysql
mssql
pgsql
sqlite
oracle
hostspec
ãdatabase
ãusername
ããš password
ã¯éåžžã¯ããŒã¿ããŒã¹æ¥ç¶èšå®ã§ãã
ã¢ããªã±ãŒã·ã§ã³ããšã«èšå®ããªãŒããŒã©ã€ãããã«ã¯ã apps/frontend/config/databases.yml
ã®ãããªã¢ããªã±ãŒã·ã§ã³åºæã®ãã¡ã€ã«ãç·šéããå¿
èŠããããŸãã
SQLiteããŒã¿ããŒã¹ã䜿ãå Žåãhostspec
ãã©ã¡ãŒã¿ãŒã«ããŒã¿ããŒã¹ãã¡ã€ã«ã®ãã¹ãèšå®ããªããã°ãªããŸãããããšãã°ãããã°ã®ããŒã¿ããŒã¹ã data/blog.db
ã«ä¿åããå Žåãdatabases.yml
ãã¡ã€ã«ã¯ãªã¹ã8-19ã®ããã«ãªããŸãã
ãªã¹ã8-19 - SQlite ããŒã¿ããŒã¹ã®æ¥ç¶èšå®ã¯ãã¡ã€ã«ãã¹ããã¹ããšããŠäœ¿ã
[yml]
all:
propel:
class: sfPropelDatabase
param:
phptype: sqlite
database: %SF_DATA_DIR%/blog.db
çæã¢ãã«ã®ã¡ãœããã¯ãã°ããããã®ã§ãããååã§ã¯ãªãããšã¯ãããããŸããç¬èªã®ããžãã¹ããžãã¯ãå®è£ ãããšåæã«ãæ°ããã¡ãœãããè¿œå ãããæ¢åã®ã¡ãœããããªãŒããŒã©ã€ãããããšã§ãããžãã¹ããžãã¯ãæ¡åŒµããå¿ èŠããããŸãã
lib/model/
ãã£ã¬ã¯ããªã®ãªãã®ç©ºã®çæã¢ãã«ã¯ã©ã¹ã«æ°ããã¡ãœãããè¿œå ã§ããŸããçŸåšã®ãªããžã§ã¯ãã¡ãœãããåŒã³åºãã«ã¯ $this
ã䜿ããçŸåšã®ã¯ã©ã¹ã®ã¹ã¿ãã£ãã¯ã¡ãœãããåŒã³åºãã«ã¯ self::
ã䜿ããŸããã«ã¹ã¿ã ã¯ã©ã¹ã lib/model/om/
ãã£ã¬ã¯ããªã®ãªãã«èšçœ®ããã Base
ã¯ã©ã¹ã®ã¡ãœãããç¶æ¿ããããšãèŠããŠãããŠãã ããã
ããšãã°ããªã¹ã8-20ã§ç€ºãããããã«ããªã¹ã8-3ãããšã«çæããã Article
ãªããžã§ã¯ãã«å¯ŸããŠãArticle
ã¯ã©ã¹ã®ãªããžã§ã¯ãã echo ããããšã§ã¿ã€ãã«ã衚瀺ã§ããããã«ã__toString()
ããžãã¯ã¡ãœãããè¿œå ã§ããŸãã
ãªã¹ã8-20 - ã¢ãã«ãã«ã¹ã¿ãã€ãºãã (lib/model/Article.php
)
[php]
class Article extends BaseArticle
{
public function __toString()
{
return $this->getTitle(); // getTitle() 㯠BaseArticle ããç¶æ¿ããã
}
}
察ã®ã¯ã©ã¹ãæ¡åŒµããããšãã§ããŸããããšãã°ããªã¹ã8-21ã§ç€ºãããããã«ãèšäºäœæã®æ¥ä»é ã§äžŠã¹ããããã¹ãŠã®èšäºãæ€çŽ¢ããããã«ã¡ãœãããè¿œå ããŸãã
ãªã¹ã8-21 - ã¢ãã«ãã«ã¹ã¿ãã€ãºãã (lib/model/ArticlePeer.php
)
[php]
class ArticlePeer extends BaseArticlePeer
{
public static function getAllOrderedByDate()
{
$c = new Criteria();
$c->addAscendingOrderByColumn(self::CREATED_AT);
return self::doSelect($c);
}
}
ãªã¹ã8-22ã§ç€ºãããããã«ãæ°ããã¡ãœããã®äœ¿ãæ¹ã¯çæã¡ãœãããšåãã§ãã
ãªã¹ã8-22 -ã«ã¹ã¿ã ã¢ãã«ã¡ãœããã®äœ¿ãæ¹ã¯çæã¡ãœãããšäŒŒãŠãã
[php]
foreach (ArticlePeer::getAllOrderedByDate() as $article)
{
echo $article; // __toString()ããžãã¯ã¡ãœãããåŒã³åºã
}
Baseã¯ã©ã¹
ã®çæã¡ãœãããããªãã®èŠä»¶ã«åããªãå Žåããããã®ã¡ãœãããã«ã¹ã¿ã ã¯ã©ã¹ã§ãªãŒããŒã©ã€ãããããšãã§ããŸããåãã¡ãœããã®ã·ã°ãã㣠(ããªãã¡ãåãæ°ã®åŒæ°) ã䜿ã£ãŠããããšã確èªããŠãã ããã
ããšãã°ã$article->getComments()
ã¡ãœããã¯Comment
ãªããžã§ã¯ãã®é
åãé äžåã§è¿ããŸããææ°ã³ã¡ã³ããäžçªæåã«ãªãããã«äœææ¥æã®é åºã§ã³ã¡ã³ãã䞊ã¹ããå Žåããªã¹ã8-23ã§ç€ºãããããã«getComments()
ã¡ãœããããªãŒããŒã©ã€ãããŸãããªãªãžãã«ã® getComments()
ã¡ãœãã (lib/model/om/BaseArticle.php
ã§èŠã€ãã) ã®å¿
é ãã©ã¡ãŒã¿ãŒã¯åºæºå€ãšæ¥ç¶ã®å€ãªã®ã§ãããªãã®ã¡ãœãããåãããšãè¡ããªããã°ãªããªãããšã«æ³šæããŠãã ããã
ãªã¹ã8-23 - æ¢åã®ã¢ãã«ã¡ãœããããªãŒããŒã©ã€ããã (lib/model/Article.php
)
[php]
public function getComments($criteria = null, $con = null)
{
if (is_null($criteria))
{
$criteria = new Criteria();
}
else
{
// PHP 5 ã§ã¯ãªããžã§ã¯ãã¯åç
§ã§æž¡ãããã®ã§ããªãªãžãã«ã®ä¿®æ£ãé¿ããã«ã¯ãclone ããªããã°ãªããªã
$criteria = clone $criteria;
}
$criteria->addDescendingOrderByColumn(CommentPeer::CREATED_AT);
return parent::getComments($criteria, $con);
}
ã«ã¹ã¿ã ã¡ãœããã¯æçµçã«èŠªã® Base
ã¯ã©ã¹ã®1ã€ãåŒã³åºããŸããããã¯ããç¿æ
£ã§ããããããªãããå®å
šã«ãããåé¿ããæãçµæãè¿ãããšãã§ããŸãã
äžè¬çã«è€æ°ã®ã¢ãã«ãä¿®æ£ãããã®ã¯åå©çšå¯èœã§ããããšãã°ãã¢ãã«ãªããžã§ã¯ãããœãŒãå¯èœã«ããŠãªããžã§ã¯ãã®ä¿åãåæã«èµ·ããããšãé²æ¢ãã楜芳çããã¯(ãªããã£ãã¹ãã£ãã¯ããã¯)ã«ããããšã¯å€ãã®ã¯ã©ã¹ã«è¿œå ã§ããäžè¬çãªæ¡åŒµæ¹æ³ã§ãã
symfony ã¯ãããã®æ¡åŒµæ©èœãããã€ãã¢ã«ãŸãšããŸããããã€ã㢠(behavior) ãšã¯ã¢ãã«ã¯ã©ã¹ã«è¿œå ã¡ãœãããæäŸããå€éšã¯ã©ã¹ã§ããã¢ãã«ã¯ã©ã¹ã¯ããã¯ãæã¡ãããã€ãã¢ãæ¡åŒµããæ¹æ³ãç¥ã£ãŠããŸãã
ã¢ãã«ã¯ã©ã¹ã®ããã€ãã¢ãæå¹ã«ããã«ã¯ãconfig/propel.ini
ãã¡ã€ã«ã®èšå®ã®1ã€ãä¿®æ£ããªããã°ãªããŸãã:
propel.builder.AddBehaviors = true // ããã©ã«ãå€ã¯ false
symfony ã«ããã©ã«ãã§æèŒãããŠããããã€ãã¢ã¯ååšããŸãããããããã¯ãã©ã°ã€ã³ãéããŠã€ã³ã¹ããŒã«ã§ããŸãããã£ããããã€ãã¢ã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããããšã1è¡ã§ããã€ãã¢ã«ã¯ã©ã¹ãå²ãåœãŠãããšãã§ããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ã« sfPropelParanoidBehaviorPlugin
ãã€ã³ã¹ããŒã«ããå ŽåãArticle.class.php
ã®æåŸã®è¡ã«æ¬¡ã®ã³ãŒããè¿œå ããã°ãã®ããã€ãã¢ãæ〠Article
ã¯ã©ã¹ãæ¡åŒµã§ããŸã:
[php]
sfPropelBehavior::add('Article', array(
'paranoid' => array('column' => 'deleted_at')
));
ã¢ãã«ããªãã«ãããããšã§ãsfPropelParanoidBehavior::disable()
ã§ããã€ãã¢ãäžæçã«ç¡å¹ã«ããªãããããåé€ããã Article
ãªããžã§ã¯ã㯠ORM ã䜿ãã¯ãšãªã«ã¯èŠããªãã ãã§ãããŒã¿ããŒã¹ã«ä¿åããããŸãŸã«ãªããŸãã
代ããã«ãããã€ãã¢ã®ãªã¹ãã_behaviors
ããŒã®äžã«è¿œå ããããšã§ schema.yml
ã®ãªãã§çŽæ¥ããã€ãã¢ã宣èšããããšãã§ããŸã (次ã®ãªã¹ã8-34ãåç
§)ã
ããã€ãã¢ãèŠã€ããã«ã¯ symfony ã®ãã©ã°ã€ã³ã®ãªãã£ã·ã£ã«ãªããžããªãåç §ããŠãã ãããããããã®ãã©ã°ã€ã³ã«ã¯ç¬èªã®ããã¥ã¡ã³ããšã€ã³ã¹ããŒã«ã¬ã€ãããããŸãã
ãªã¹ã8-3ã§ç€ºãããããã«ãschema.yml
ãã¡ã€ã«ãç°¡ç¥åã§ããŸããããããªãããªã¬ãŒã·ã§ãã«ã¢ãã«ãè€éã§ããããšããããããŸããã»ãšãã©ãã¹ãŠã®äºäŸã«å¯ŸåŠã§ããã¹ããŒãã®æ¡åŒµæ§æãããçç±ã¯ããããããã§ãã
ãªã¹ã8-24ã§ç€ºãããããã«ãæ¥ç¶ãšããŒãã«ã¯åºæã®å±æ§ãæã€ããšãã§ããŸããããã㯠_attributes
ããŒã®äžã§èšå®ããŸãã
ãªã¹ã8-24 - æ¥ç¶ãšããŒãã«ã®å±æ§
[yml]
propel:
_attributes: { noXsd: false, defaultIdMethod: none, package: lib.model }
blog_article:
_attributes: { phpName: Article }
ã³ãŒãçæãè¡ãããåã«ã¹ããŒããæ€èšŒãããå ŽåãèããŸãããããè¡ãã«ã¯ãæ¥ç¶ã® noXSD
å±æ§ãç¡å¹ã«ããŸããæ¥ç¶ã¯ defaultIdMethod
å±æ§ããµããŒãããŸããäœãæäŸãããªããã°ãID ãçæããããŒã¿ããŒã¹ã®ãã€ãã£ããªã¡ãœããã䜿ãããŸããããšãã°ãMySQL ã§ã¯ autoincrement
ãPostgreSQL ã§ã¯ sequences
ã§ããã»ãã®ãšãããå€ã¯ none
ã§ãã
package
å±æ§ã¯åå空éã®ãããªãã®ã§ã; ããã¯çæã¯ã©ã¹ãä¿åãããå Žæã®ãã¹ã決ããŸããããã©ã«ãå€ã¯lib/model/
ã§ããããµãããã±ãŒãžã®ã¢ãã«ãç·šæããããã«å€æŽã§ããŸããããšãã°ãããžãã¹ã®ã³ã¢ã¯ã©ã¹ãšããŒã¿ããŒã¹ã«ä¿åãããçµ±èšãšã³ãžã³ãå®çŸ©ããã¯ã©ã¹ãåããã£ã¬ã¯ããªã®ãªãã§æ··åšãããããªãå Žåãlib.model.business
ããã±ãŒãžãš lib.model.stats
ããã±ãŒãžã§2ã€ã®ã¹ããŒããå®çŸ©ããŸãã
ããŒãã«ããããã³ã°ããçæã¯ã©ã¹ã®ååãèšå®ããããã«äœ¿ããã phpName
ããŒãã«å±æ§ã¯ãã§ã«èŠãŸããã
ãªã¹ã8-25ã§ç€ºãããããã«ãããŒã«ã©ã€ãºãããå 容ãåããããŒãã« (ããªãã¡ãåœéåã®ããã«ãé¢é£ããããŒãã«ã®ãªãã«ååšãããè€æ°ã®ããŒãžã§ã³ã®å 容) ã2ã€ã®è¿œå å±æ§ããšããŸã (詳现ã¯13ç« ãåç §)ã
ãªã¹ã8-25 - åœéåããŒãã«çšã®å±æ§
[yml]
propel:
blog_article:
_attributes: { isI18N: true, i18nTable: db_group_i18n }
SIDEBAR è€æ°ã®ã¹ããŒããæ±ã
ã¢ããªã±ãŒã·ã§ã³ããšã«è€æ°ã®ã¹ããŒããçšæã§ããŸããsymfony ã¯
config/
ãã©ã«ããŒã®ååãschema.yml
ãããã¯schema.yml
ã§çµãããã¹ãŠã®ãã¡ã€ã«ãèæ ®ã«å ¥ããŸããã¢ããªã±ãŒã·ã§ã³ãå€ãã®ããŒãã«ãæã€å Žåããããã¯ããŒãã«ãåãæ¥ç¶ãå ±æããªãå Žåããã®ã¢ãããŒãããšãŠã䟿å©ã§ããããšãããããŸãã次ã®2ã€ã®ã¹ããŒããèããŠãã ãã:
[yml] // config/business-schema.yml propel: blog_article: _attributes: { phpName: Article } id: title: varchar(50) // config/stats-schema.yml propel: stats_hit: _attributes: { phpName: Hit } id: resource: varchar(100) created_at:
åãæ¥ç¶ãå ±æããäž¡æ¹ã®ã¹ããŒã (
propel
) ãšArticle
ã¯ã©ã¹ãšHit
ã¯ã©ã¹ã¯åãlib/model/
ãã£ã¬ã¯ããªã®ããšã§çæãããŸããããããã¹ããŒãã1ã€ã ãæžããããã«ãã¹ãŠã®ãã®ããšãè¡ãããŸããç°ãªãæ¥ç¶(ããšãã°ã
databases.yml
ã§å®çŸ©ãããpropel
ãšpropel_bis
) ã䜿ãç°ãªãã¹ããŒããæã€ããšãå¯èœã§çæã¯ã©ã¹ããµããã£ã¬ã¯ããªã«åé¡ã§ããŸãã[yml] // config/business-schema.yml propel: blog_article: _attributes: { phpName: Article, package: lib.model.business } id: title: varchar(50) // config/stats-schema.yml propel_bis: stats_hit: _attributes: { phpName: Hit, package: lib.model.stat } id: resource: varchar(100) created_at:
å€ãã®ã¢ããªã±ãŒã·ã§ã³ã¯è€æ°ã®ã¹ããŒãã䜿ããŸãããšãããããã©ã°ã€ã³ã®ãªãã«ã¯ã¢ããªã±ãŒã·ã§ã³ç¬èªã®ã¯ã©ã¹ã«å¹²æžããªãããã«ãã©ã°ã€ã³ç¬èªã®ã¹ããŒããšããã±ãŒãžãæã€ãã®ããããŸã(詳现ã¯17ç« ãåç §)ã
åºæ¬æ§æã¯éžæè¢ã2ã€äžããŠãããŸã; (空ã®å€ãæž¡ãããšã§) symfony ã«ååããã«ã©ã ã®ç¹åŸŽãæšæž¬ããããã1ã€ã® type
ããŒã¯ãŒãã§åãå®çŸ©ãããã§ãããªã¹ã8-26ã¯ãããã®éžæè¢ã®ãææ¬ã瀺ããŠããŸãã
ãªã¹ã8-26 - åºæ¬çãªã«ã©ã å±æ§
[yml]
propel:
blog_article:
id: ~ # symfony ã«ä»äºãä»»ãã
title: varchar(50) # ããªãèªèº«ãåãæå®ãã
ããããªããããã£ãšå€ãã®ã«ã©ã å±æ§ãå®çŸ©ã§ããŸããããè¡ãå Žåããªã¹ã8-27ã§ç€ºãããããã«ãã«ã©ã ã®èšå®ãé£æ³é åãšããŠå®çŸ©ããå¿ èŠããããŸãã
ãªã¹ã8-27 - è€éãªã«ã©ã å±æ§
[yml]
propel:
blog_article:
id: { type: integer, required: true, primaryKey: true, autoIncrement: true }
name: { type: varchar(50), default: foobar, index: true }
group_id: { type: integer, foreignTable: db_group, foreignReference: id, onDelete: cascade }
ã«ã©ã ã®ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ã:
type
: ã«ã©ã ã®åãéžæè¢ã¯boolean
ãtinyint
ãsmallint
ãinteger
ãbigint
ãdouble
ãfloat
ãreal
ãdecimal
ãchar
ãvarchar(size)
ãlongbarchar
ãdate
ãtime
ãtimestamp
ãbu_date
ãbu_timestamp
ãblob
ãšclob
ã§ããrequired
: ããŒã«å€ãã«ã©ã ãå¿ é ã«ãããå Žåãããtrue
ã«ã»ããããŸããsize
: åããµããŒããããã£ãŒã«ãã®ãµã€ãºãããã¯é·ããscale
: decimal ããŒã¿åã®ããã®å°æ°äœ (size ãæå®ããªããã°ãªããŸãã)ãdefault
: ããã©ã«ãå€ãprimaryKey
: ããŒã«å€ãäž»ããŒã«å¯ŸããŠãããtrue
ã«ã»ããããŸããautoIncrement
: ããŒã«å€ããªãŒãã€ã³ã¯ãªã¡ã³ããããå€ããšãinteger
åã®ã«ã©ã ã«å¯ŸããŠãããtrue
ã«ã»ããããŸããsequence
:autoIncrement
ã«ã©ã ã«å¯ŸããŠã·ãŒã±ã³ã¹ã䜿ãããŒã¿ããŒã¹ (ããšãã° PostgreSQLãOracle) ã®ããã®ã·ãŒã±ã³ã¹åãindex
: ããŒã«å€ãã·ã³ãã«ãªã€ã³ããã¯ã¹ã欲ããå Žåã¯true
ã«ãã«ã©ã ã§ãŠããŒã¯ã€ã³ããã¯ã¹ãäœãããå Žåã¯unique
ã«ã»ããããŸããforeignTable
: å¥ã®ããŒãã«ã«å€éšããŒãäœãããã«äœ¿ããããããŒãã«ã®ååãforeignReference
:foreingTable
çµç±ã§å€éšããŒãå®çŸ©ãããå Žåã®é¢é£ã«ã©ã ã®ååãonDelete
: é¢é£ããŒãã«ã«ååšããã¬ã³ãŒããåé€ããããšãã«ã¢ã¯ã·ã§ã³ãèµ·åãããããã«æå®ããŸããsetnull
ã«ã»ãããããšããå€éšããŒã®ã«ã©ã ã¯null
ã«ã»ãããããŸããcascade
ã«ã»ãããããšããã¬ã³ãŒãã¯åé€ãããŸããããŒã¿ããŒã¹ãšã³ãžã³ã set ããã€ãã¢ããµããŒãããªãå ŽåãORM ããšãã¥ã¬ãŒãããŸããããã¯foreignTable
ãšforeingReference
ãæã€ã«ã©ã ã ãã該åœããŸããisCulture
: ããŒã«å€ãããŒã«ã©ã€ãºãããå 容ããŒãã«ã«ååšãã culture ã«ã©ã ã«å¯ŸããŠãããtrue
ã«ã»ããããŠãã ãã(13ç« ãåç §)ã
foreignTable
ãš foreignReference
ã«ã©ã å±æ§ã®ä»£ããã«ãå€éšããŒãããŒãã«ã® _foreignKeys:
ããŒã®äžã«è¿œå ã§ããŸãããªã¹ã8-28ã®ã¹ããŒã㯠blog_user
ããŒãã«ã® id
ã«ã©ã ã«ããããã user_id
ã«ã©ã ã®äžåŽã«å€éšããŒãäœããŸã
ãªã¹ã8-28 - å€éšããŒã®ä»£æ¿æ§æ
[yml]
propel:
blog_article:
id: ~
title: varchar(50)
user_id: { type: integer }
_foreignKeys:
-
foreignTable: blog_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
ãªã¹ã8-29ã§ç€ºãããããã«ããã®ä»£æ¿æ§æã¯è€æ°åç §ãæã€å€éšããŒã«ååãã€ããããã«åœ¹ç«ã¡ãŸãã
ãªã¹ã8-29 - è€æ°åç §ã®å€éšããŒã«é©çšãããå€éšããŒã®ä»£æ¿æ§æ
_foreignKeys:
my_foreign_key:
foreignTable: db_user
onDelete: cascade
references:
- { local: user_id, foreign: id }
- { local: post_id, foreign: id }
index
ã«ã©ã å±æ§ã®ä»£ããã«ãã€ã³ããã¯ã¹ãããŒãã«ã® indexes:
ããŒã®äžã«è¿œå ã§ããŸãããŠããŒã¯ã€ã³ããã¯ã¹ãå®çŸ©ãããå Žåã_uniques:
ããããŒã代ããã«äœ¿ããªããã°ãªããŸããããªã¹ã8-30ã¯ã€ã³ããã¯ã¹ã®ä»£æ¿æ§æã瀺ããŠããŸãã
ãªã¹ã8-30 - ã€ã³ããã¯ã¹ãšãŠããŒã¯ã€ã³ããã¯ã¹ã®ä»£æ¿æ§æ
[yml]
propel:
blog_article:
id: ~
title: varchar(50)
created_at:
_indexes:
my_index: [title(10), user_id]
_uniques:
my_other_index: [created_at]
代æ¿æ§æã¯è€æ°ã®ã«ã©ã ã§æ§ç¯ãããã€ã³ããã¯ã¹ã«å¯ŸããŠã®ã¿åœ¹ç«ã¡ãŸãã
å€ãæããªãã«ã©ã ã«ééãããšããsymfony ã¯ããã€ãã®ããžãã¯ãè¡ããããèªèº«ã®å€ãè¿œå ããŸãã空ã®ã«ã©ã ã«è¿œå ããã詳现å 容ã«é¢ããŠãªã¹ã8-31ãã芧ãã ããã
ãªã¹ã8-31 - ã«ã©ã ã®ååããæšå®ãããã«ã©ã ã®è©³çŽ°å 容
// id ãšããååãæã€ç©ºã®ã«ã©ã ã¯äž»ããŒãšèŠãªããã
id: { type: integer, required: true, primaryKey: true, autoIncrement: true }
// XXX_id ãšããååãæã€ç©ºã®ã«ã©ã ã¯å€éšããŒãšèŠãªããã
foobar_id: { type: integer, foreignTable: db_foobar, foreignReference: id }
// created_atãupdated atãcreated_on ãš updated_on ãšããååãæã€ç©ºã®ã«ã©ã ã¯
// æ¥ä»ãšèŠãªããèªåçã« timestamp åããšã
created_at: { type: timestamp }
updated_at: { type: timestamp }
å€éšããŒã«å¯ŸããŠãsymfony ã¯ã«ã©ã ã®ååã®å§ãã§åã phpName
ãæã€ããŒãã«ãæ¢ãã1ã€ãèŠã€ãã£ããããã®ããŒãã«ã®ååã foreignTable
ãšããŠãšããŸãã
symfony ã¯é¢é£ããŒãã«ã®ã³ã³ãã³ãã®åœéåããµããŒããããŸãããã®ããšã¯ãã³ã³ãã³ãã®ãµããžã§ã¯ããåœéåãããšãã2ã€ã®ããŒãã«ã«åå¥ã«ä¿åãããããšãæå³ããŸã: 1ã€ã¯å€ãããªãã«ã©ã ã§ãã1ã€ãåœéåãããã«ã©ã ã§ãã
schema.yml
ãã¡ã€ã«ã«ãããŠãããŒãã«ã« footbar_i18n
ãšããååãã€ãããšããã¹ãŠãæé»ã®ãã¡ã«è¡ãããŸããããšãã°ãåœéåãããå
容ã®ã¡ã«ããºã ãåãããã«ãªã¹ã8-32ã§ç€ºãããã¹ããŒãã¯ã«ã©ã ãšããŒãã«å±æ§ãèªåçã«åããŠããŸããå
éšã§ã¯ããããããªã¹ã8-33ã®ããã«æžããããã®ãšã㊠symfony ã¯ç解ããŸããåœéåã¯13ç« ã§è©³ãã説æããŸãã
ãªã¹ã8-32 - æé»çãªåœéåã¡ã«ããºã
[yml]
propel:
db_group:
id: ~
created_at: ~
db_group_i18n:
name: varchar(50)
ãªã¹ã8-33 - æ瀺çãªåœéåã¡ã«ããºã
[yml]
propel:
db_group:
_attributes: { isI18N: true, i18nTable: db_group_i18n }
id: ~
created_at: ~
db_group_i18n:
id: { type: integer, required: true, primaryKey: true,foreignTable: db_group, foreignReference: id, onDelete: cascade }
culture: { isCulture: true, type: varchar(7), required: true,primaryKey: true }
name: varchar(50)
ããã€ã㢠(behavior) 㯠Propel ã®ã¯ã©ã¹ã«æ°ããæ©èœãè¿œå ãããã©ã°ã€ã³ã«ãã£ãŠæäŸãããã¢ãã«ãä¿®æ£ããã©ã€ãã©ãªã§ãã17ç« ã§ããã€ãã¢ã詳ãã説æããŸããããã€ãã¢ãããããã®ããŒãã«ã«å¯ŸããŠããã©ã¡ãŒã¿ãŒãšäžç·ã«ã_behaviors
ããŒã®äžã«äžŠã¹ãããšã§ã¹ããŒãã®ãªãã§ããã€ãã¢ãçŽæ¥å®çŸ©ã§ããŸãããªã¹ã8-34㯠BlogArticle
ã¯ã©ã¹ã paranoid
ããã€ãã¢ã§æ¡åŒµããäŸã瀺ããŠããŸãã
ãªã¹ã8-34 - ããã€ãã¢ã®å®£èš
[yml]
propel:
blog_article:
title: varchar(50)
_behaviors:
paranoid: { column: deleted_at }
å®éã®ãšãããschema.yml
ãã©ãŒããã㯠symfony å
éšã«ååšããŸããpropel-command
ãåŒã³åºããšããsymfony ã¯å®éã«ãã®ãã¡ã€ã«ãgenerated-schema.xml
ãã¡ã€ã«ã«ç¿»èš³ããŸããå®éã«ã¯ãã®XMLãã¡ã€ã«ã¯ã¢ãã«ã®ã¿ã¹ã¯ãå®è¡ããããã« Propel ãå¿
èŠãšããçš®é¡ã®ãã¡ã€ã«ã§ãã
schema.xml
ãã¡ã€ã«ã¯ YAML ãšåçã®ãã®ãšããŠåãæ
å ±ãæ ŒçŽããŸããããšãã°ããªã¹ã8-35ã§ç€ºãããããã«ããªã¹ã8-3㯠XML ãã¡ã€ã«ã«å€æãããŸãã
ãªã¹ã8-35 - ãªã¹ã8-3ã«å¯Ÿå¿ãã schema.yml
ã®ãµã³ãã«
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<database name="propel" defaultIdMethod="native" noXsd="true" package="lib.model">
<table name="blog_article" phpName="Article">
<column name="id" type="integer" required="true" primaryKey="true"autoIncrement="true" />
<column name="title" type="varchar" size="255" />
<column name="content" type="longvarchar" />
<column name="created_at" type="timestamp" />
</table>
<table name="blog_comment" phpName="Comment">
<column name="id" type="integer" required="true" primaryKey="true"autoIncrement="true" />
<column name="article_id" type="integer" />
<foreign-key foreignTable="blog_article">
<reference local="article_id" foreign="id"/>
</foreign-key>
<column name="author" type="varchar" size="255" />
<column name="content" type="longvarchar" />
<column name="created_at" type="timestamp" />
</table>
</database>
schema.xml
ãã©ãŒãããã®æžããã㯠Propel ãããžã§ã¯ãã® å
¬åŒãµã€ã ããã¥ã¡ã³ããš "Getting Started" ã®ã»ã¯ã·ã§ã³ã§èŠãããšãã§ããŸãã
YAML ãã©ãŒãããã¯ã¹ããŒãã®èªã¿æžããã·ã³ãã«ã«ä¿ã€ããã«èšèšãããŸãããã ãã¬ãŒããªãã¯ãã£ãšãè€éãªã¹ããŒãã schema.yml
ãã¡ã€ã«ã§èšè¿°ã§ããªãããšã§ããäžæ¹ã§ãXML ãã©ãŒãããã¯ãã©ããªã«è€éãªãã®ã§ãããããŒã¿ããŒã¹ã®ãã³ããŒåºæã®èšå®ãããŒãã«ãç¶æ¿ãªã©ãå«ããŠãå®å
šãªã¹ããŒãæ§æãèšè¿°ã§ããŸãã
å®éã«ã¯ symfony 㯠XML ãã©ãŒãããã§æžãããã¹ããŒããç解ããŸããããªãã®ã¹ããŒãã YAML ã®æ§æã§èšè¿°ããã«ã¯è€éãããå Žåãæ¢åã® XML ã¹ããŒããããå Žåããããã¯ãã§ã« Propel ã® XML ãã©ãŒãããã«æ
£ã芪ããã§ããå Žåãsymfony ã® YAML æ§æã«åãæ¿ããå¿
èŠã¯ãããŸãããschema.yml
ããããžã§ã¯ãã® config/
ãã£ã¬ã¯ããªã«èšçœ®ããã¢ãã«ããã«ãããŸããç°¡åã§ããã
SIDEBAR symfony ã«ããã Propel
ãã®ç« ã§èª¬æããããã¹ãŠã®å 容㯠symfony åºæã®ãã®ã§ã¯ãªããããã Propel ã®ãã®ã§ããPropel 㯠symfony ã§åªå ããããªããžã§ã¯ã/ãªã¬ãŒã·ã§ãã«æœè±¡åã¬ã€ã€ãŒã§ããã代ããã®ãã®ãéžã¶ããšãã§ããŸããããããªããã次ã®çç±ããã symfony 㯠Propel ã§ããã·ãŒã ã¬ã¹ã«åäœããŸã:
ãã¹ãŠã®ãªããžã§ã¯ãããŒã¿ã¢ãã«ã¯ã©ã¹ãš
Criteria
ã¯ã©ã¹ã¯ãªãŒãããŒãã¯ã©ã¹ã§ãããããã䜿ããšåæã«ãsymfony ã¯æ£ãããã¡ã€ã«ãã€ã³ã¯ã«ãŒããããã¡ã€ã«ã«ã€ã³ã¯ã«ãŒãã¹ããŒãã¡ã³ããæåã§è¿œå ããå¿ èŠã¯ãããŸãããsymfony ã«ãããŠãPropel ãèµ·åããããåæåããå¿ èŠããããŸããããªããžã§ã¯ãã Propel ãå©çšãããšããã©ã€ãã©ãªã¯èªåèªèº«ã§åæåãè¡ããŸããsymfony ãã«ããŒã¯ãã€ã¬ãã«ãªã¿ã¹ã¯ (ããšãã°ããŒãžåå²ãããã¯ãã£ã«ã¿ãªã³ã°) ãå®çŸããããã« Propel ãªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠäœ¿ããŸããPropel ãªããžã§ã¯ãã¯ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã©ããããããã¿ã€ãã³ã°ãšããã¯ãšã³ãã®çæãå¯èœã«ããŸã (14ç« ã§è©³çŽ°ãªèª¬æãããŸã)ãschema.yml
ãã¡ã€ã«ãéããŠã¹ããŒããéãæžããŸããPropel ãããŒã¿ããŒã¹ã«å¯ŸããŠç¬ç«ããŠããããšãšåæ§ã«ãsymfony ã Propel ã«å¯ŸããŠç¬ç«ããŠããŸãã
ORM ã䜿ãå Žåã®ãã¬ãŒããªãã¯ããŒã¿æ§é ã2åå®çŸ©ããªããã°ãªããªãããšã§ã: 1åç®ã¯ããŒã¿ããŒã¹ã«å¯ŸããŠã2åç®ã¯ãªããžã§ã¯ãã¢ãã«ã«å¯ŸããŠã§ãã幞ãã«ããŠãsymfony ã¯äžæ¹ãããšã«ããäžæ¹ãçæããã³ãã³ãã©ã€ã³ããŒã«ãæäŸããã®ã§ãéè€äœæ¥ãåé¿ã§ããŸãã
schema.yml
ãã¡ã€ã«ãæžãããšã§ã¢ããªã±ãŒã·ã§ã³ãå§ããå Žåãsymfony 㯠YAML ããŒã¿ã¢ãã«ããçŽæ¥ããŒãã«ãäœæãã SQL ã¯ãšãªãçæã§ããŸããã¯ãšãªã䜿ãã«ã¯ããããžã§ã¯ãã®ã«ãŒãã«ç§»åããŠæ¬¡ã®ã³ãã³ããå
¥åããŸã:
$ php symfony propel:build-sql
myproject/data/sql/
ãã£ã¬ã¯ããªã®ãªã㧠lib.model.schema.sql
ãã¡ã€ã«ãäœãããŸããSQL ã®çæã³ãŒãã propel.ini
ãã¡ã€ã«ã® phptype
ãã©ã¡ãŒã¿ãŒã§å®çŸ©ãããããŒã¿ããŒã¹ã·ã¹ãã ã«å¯ŸããŠæé©åãããããšãèŠããŠãããŠãã ããã
ããŒãã«ãçŽæ¥ãã«ãããããã« schema.sql
ãã¡ã€ã«ãå©çšã§ããŸããããšãã°ãMySQL ã§ã¯ã次ã®ã³ãã³ããå
¥åããŸã:
$ mysqladmin -u root -p create blog
$ mysql -u root -p blog < data/sql/lib.model.schema.sql
çæããã SQL ãã»ãã®ç°å¢ã®ããŒã¿ããŒã¹ã®ãªãã«ãããããã¯ã»ãã® DBMS ã«å€æŽããããã«åœ¹ç«ã¡ãŸããæ¥ç¶èšå®ã propel.ini
ã§é©åã«å®çŸ©ãããå Žåããããèªåçã«è¡ã propel:insert-sql
ã¿ã¹ã¯ã䜿ãããšãã§ããŸãã
TIP ã³ãã³ãã©ã€ã³ã¯ããã¹ããã¡ã€ã«ãããšã«ããŒã¿ãããŒã¿ããŒã¹ã«æå ¥ããã¿ã¹ã¯ãæäŸããŸãã
propel:data-load
ã¿ã¹ã¯ãš YAML ãã£ã¯ã¹ãã£ãã¡ã€ã«ã®è©³çŽ°ãªæ å ±ã¯16ç« ãã芧ãã ããã
ã€ã³ããã¹ãã¯ã·ã§ã³ (introspection) ã®ãããã§ãæ¢åã®ããŒã¿ããŒã¹ãã schema.yml
ãã¡ã€ã«ãçæããããã« symfony 㯠Propel ãå©çšã§ããŸããããã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãè¡ããšãããããã¯ãªããžã§ã¯ãã¢ãã«ãããããŒã¿ããŒã¹ã«ãšãçµã¿ããå Žåã«åœ¹ç«ã¡ãŸãã
ãããè¡ãããã«ããããžã§ã¯ãã® databases.yml
ãã¡ã€ã«ãæ£ããããŒã¿ããŒã¹ãæã瀺ããã¹ãŠã®æ¥ç¶èšå®ãåããŠããããšã確èªããå¿
èŠããããŸãããããã propel:build-schema
ã³ãã³ããåŒã³åºããŸã:
$ php symfony propel:build-schema
ããŒã¿ããŒã¹æ§é ããçæãããæ°åã® schema.yml
ãã¡ã€ã«ã¯ config/
ãã£ã¬ã¯ããªã®ãªãã§çæãããŸãããã®ã¹ããŒããããšã«ã¢ãã«ããã«ãã§ããŸãã
ã¹ããŒãçæã³ãã³ãã¯ãšãŠã匷åã§ããŒã¿ããŒã¹ã«äŸåããå€ãã®æ
å ±ãã¹ããŒãã«è¿œå ã§ããŸããYAML ãã©ãŒãããã¯ãã®çš®ã®ãã³ããŒæ
å ±ãæ±ãããšãã§ããªãã®ã§ããã®æ
å ±ãå©çšããã«ã¯ XML ãã©ãŒããããçæããå¿
èŠããããŸããbuild-schema
ã¿ã¹ã¯ã« xml
ã®åŒæ°ãè¿œå ããããšã§ãããç°¡åã«è¡ãããšãã§ããŸã:
$ php symfony propel:build-schema --xml
schema.yml
ãã¡ã€ã«ãçæãã代ããã«ãããã¯ãPropel ãšååã«äºææ§ãæã¡ããã¹ãŠã®ãã³ããŒæ
å ±ãåãã schema.xml
ãã¡ã€ã«ãäœããŸããããããXML ã®çæã¹ããŒãã¯ãšãŠãåé·ã§èªãã®ããããããããšã念é ã«çœ®ããŠãã ããã
SIDEBAR propel.ini ã®èšå®
propel:build-sql
ãšpropel:build-schema
ã¿ã¹ã¯ã¯databases.yml
ãã¡ã€ã«ã§å®çŸ©ãããæ¥ç¶èšå®ã䜿ããŸãããããããpropel.ini
ãšããååã®å¥ã®ãã¡ã€ã«ã®æ¥ç¶èšå®ã䜿ããŸããpropel.ini
ã¯ãããžã§ã¯ãã®config/
ãã£ã¬ã¯ããªã«ä¿åãããŸã:propel.database.createUrl = mysql://login:passwd@localhost propel.database.url = mysql://login:passwd@localhost/blog
ãã®ãã¡ã€ã«ã¯çæã¢ãã«ã¯ã©ã¹ã symfony ãšäºææ§ã®ãããã®ã«ãã Propel ãžã§ãã¬ãŒã¿ãŒãèšå®ããããã«äœ¿ãããã»ãã®èšå®ãåããŸããããäžéšãé€ããŠãå€ãã®èšå®ã¯å éšã«é¢ãããã®ã§ããŠãŒã¶ãŒã«ã¯é¢çœããªããã®ã§ã:
// åºåºã¯ã©ã¹ã¯ symfony ã§ãªãŒãããŒãããã // 代ããã« include_once ã¹ããŒãã¡ã³ãã䜿ãããã«ãããtrueã«ã»ãããã // (ããã©ãŒãã³ã¹ã«å¯ŸããŠããããªããè² ã®åœ±é¿ããã) propel.builder.addIncludes = false // çæã¯ã©ã¹ã¯ããã©ã«ãã§ã³ã¡ã³ããããªã // ã³ã¡ã³ããåºåºã¯ã©ã¹ã«è¿œå ããããã«ãããtrueã«ã»ãããã // (ããã©ãŒãã³ã¹ã«å°ããªè² ã®åœ±é¿ããã) propel.builder.addComments = false // ããã€ãã¢ã¯ããã©ã«ãã§æ±ãããªã // ããããæ±ãããšãã§ããããã«ããã«ã¯æ¬¡ã®é ç®ã true ã«ã»ãããã propel.builder.AddBehaviors = false
propel.ini
èšå®ãã¡ã€ã«ã®ä¿®æ£åŸã«ãå€æŽãåæ ãããããã«ã¢ãã«ããªãã«ãããããšãå¿ããªãã§ãã ããã
symfony 㯠Propel ããªããžã§ã¯ããªã¬ãŒã·ã§ãã«ãããã³ã° (ORM - Object-Relational Mapping) ãšããŠãPDO (PHP Data Objects) ãããŒã¿ããŒã¹æœè±¡åã¬ã€ã€ãŒ (database abstraction layer) ãšããŠå©çšããŸããããã¯ãªããžã§ã¯ãã¢ãã«ã¯ã©ã¹ãçæããåã«ãæåã« YAML ãã©ãŒãããã§ããŒã¿ããŒã¹ã®ãªã¬ãŒã·ã§ãã«ã¹ããŒããèšè¿°ããªããã°ãªããªãããšãæå³ããŸãããããããå®è¡æã«ãããŠããªããžã§ã¯ãã®ã¡ãœãããšã¬ã³ãŒããããã¯ã¬ã³ãŒãã»ããã®æ
å ±ãæ€çŽ¢ããããã«ãã¢ã¯ã©ã¹ã䜿ããŸããæ¥ç¶èšå®ã¯è€æ°ã®æ¥ç¶ããµããŒããã databases.yml
ãã¡ã€ã«ã§å®çŸ©ãããŸãããããŠãã³ãã³ãã©ã€ã³ã«ã¯éè€ããŠæ§é ãå®çŸ©ããªãããã«ããç¹å¥ãªã¿ã¹ã¯ãå«ãŸããŸãã
ã¢ãã«ã¬ã€ã€ãŒ (model layer) 㯠symfony ãã¬ãŒã ã¯ãŒã¯ã®ãªãã§ãã£ãšãè€éã§ããè€éã§ããçç±ã®1ã€ã¯ããŒã¿æäœã蟌ã¿å ¥ã£ãåé¡ã§ããããã§ããé¢é£ããã»ãã¥ãªãã£åé¡ã¯Webãµã€ãã«ãšã£ãŠé倧ã§ç¡èŠã§ããŸãããã»ãã®çç±ã¯ symfony ãäžèŠæš¡ãã倧èŠæš¡ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãšãé©ããŠããããã§ãããã®ãããªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãsymfony ã®ã¢ãã«ã«ãã£ãŠæäŸãããèªååã¯æ¬åœã«æéãç¯çŽããã®ã§ãå éšæ§é ãåŠã¶äŸ¡å€ã¯ãããŸãã
ã§ãã®ã§ãã¢ãã«ãªããžã§ã¯ããšã¡ãœãããååã«ç解ããã«ã¯ãããããã¹ãããããšã«æéãè²»ããããšããããããªãã§ãã ããã倧ããªå ±é ¬ãšããŠã¢ããªã±ãŒã·ã§ã³ã®å ç¢æ§ãšã¹ã±ãŒã©ããªãã£ãåŸãããŸãã