This project is no longer maintained and has been archived. |
Behaviours
ã¯ããã«
ã¢ãã«ã®äžã§äŒŒãå 容ãæã€ã¯ã©ã¹ãèŠã€ããããšã¯ãããããŸãããããã®å 容ã¯ã³ã³ããŒãã³ãèªèº«ã®ã¹ããŒã(ãªã¬ãŒã·ã§ã³ãã«ã©ã ã®å®çŸ©ãã€ã³ããã¯ã¹ã®å®çŸ©ãªã©)ã«é¢é£ããããšããããŸãããã®ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããæãããªæ¹æ³ã¯åºåºã¯ã©ã¹ãšãããç¶æ¿ããã¯ã©ã¹ãçšæããããšã§ãã
ããããªããç¶æ¿ã¯ãããã®äžéšãã解決ããŸãããæ¬¡ã®ã»ã¯ã·ã§ã³ã§Doctrine_Template
ãç¶æ¿ãããã¯ããã«åŒ·åã§æè»ã§ããããšã瀺ããŸãã
Doctrine_Template
ã¯ã¯ã©ã¹ãã³ãã¬ãŒãã·ã¹ãã ã§ããåºæ¬çã«ãã³ãã¬ãŒãã¯Recordã¯ã©ã¹ãããŒãã§ãããã䜿ããå°ããªã³ã³ããŒãã³ãã§ãããã³ãã¬ãŒããããŒãããããšãsetTableDefinition()
ãšsetUp()
ã¡ãœãããèµ·åãããããã®å
éšã§ã¡ãœãããåŒã³åºããæžŠäžã®ã¯ã©ã¹ã«å°ãããŸãã
ãã®ç« ã§ã¯Doctrineã§å©çšã§ããæ§ã
ãªããã€ãã¢ã®äœ¿ãæ¹ã説æããŸããç¬èªããã€ãã¢ã®äœãæ¹ã説æããŸãããã®ç« ã®ã³ã³ã»ãããæŽãããã«Doctrine\_Template
ãšDoctrine\_Record_Generator
ã®èæ¯ã«ããçè«ã«æ
£ããªããã°ãªããŸããããããã®ã¯ã©ã¹ãã©ããªãã®ã§ããã®ãæçã«èª¬æããŸãã
ããã€ãã¢ãèšåãããšããã³ãã¬ãŒãããžã§ãã¬ãŒã¿ãšãªã¹ããŒãåºç¯å²ã«æž¡ã£ãŠäœ¿çšããã¯ã©ã¹ããã±ãŒãžãæå³ããŸãããã®ç« ã§ç޹ä»ããããã¹ãŠã®ã³ã³ããŒãã³ãã¯core
ããã€ãã¢ãšããŠã¿ãªãããŠããŸããããã¯Doctrineã®ã¡ã€ã³ãªããžããªã«ä¿ç®¡ãããŠããããšãæå³ããŸãã
éåžžããã€ãã¢ã¯ãã³ãã¬ãŒãã¯ã©ã¹(Doctrine_Template
ãç¶æ¿ããã¯ã©ã¹)ã§ãžã§ãã¬ãŒã¿ã䜿çšããŸããå
±éã®ã¯ãŒã¯ãããŒã¯æ¬¡ã®éãã§ã:
- æ°ãããã³ãã¬ãŒããåæåããã
- ãã³ãã¬ãŒãã¯ãžã§ãã¬ãŒã¿ãäœæã
initialize()
ã¡ãœãããåŒã³åºã - ãã³ãã¬ãŒãã¯ã¯ã©ã¹ã«æ·»ä»ããã
ãåç¥ãããããŸããããã³ãã¬ãŒãã¯å
±éã®å®çŸ©ãšãªãã·ã§ã³ãã¬ã³ãŒãã¯ã©ã¹ã«è¿œå ããããã«äœ¿ãããŸãããžã§ãã¬ãŒã¿ã®ç®çã¯ãšãŠãè€éã§ããéåžžãããã¯ãžã§ããªãã¯ã¬ã³ãŒãã¯ã©ã¹ãåçã«äœæããããã«äœ¿ãããŸãããããã®ãžã§ããªãã¯ã¯ã©ã¹ã®å®çŸ©ã¯ãªãŒããŒã®ã¯ã©ã¹ã«ãããŸããäŸãã°ã¯ã©ã¹ãããŒãžã§ãã³ã°ããAuditLog
ã«ã©ã ã®å®çŸ©ã¯ãã¹ãŠã®sequenceãšautoincrementã®å®çŸ©ãåé€ããã芪ã¯ã©ã¹ã®ã«ã©ã ã§ãã
ã·ã³ãã«ãªãã³ãã¬ãŒã
次ã®äŸã«ãããŠTimestampBehavior
ãšåŒã°ãããã³ãã¬ãŒããå®çŸ©ããŸããåºæ¬çã«ãã³ãã¬ãŒãã®ç®çã¯ãã®ãã³ãã¬ãŒããããŒãããã¬ã³ãŒãã¯ã©ã¹ã«æ¥ä»ã«ã©ã ã®'created'ãš'updated'ã远å ããããšã§ããå ããŠãã®ãã³ãã¬ãŒãã¯ã¬ã³ãŒãã®ã¢ã¯ã·ã§ã³ã«åºã¥ããŠãããã®ã«ã©ã ãæŽæ°ããTimestampãªã¹ããŒã䜿çšããŸãã
// models/TimestampListener.php
class TimestampListener extends Doctrine_Record_Listener { public function preInsert(Doctrine_Event $event) { $event->getInvoker()->created = date('Y-m-d', time()); $event->getInvoker()->updated = date('Y-m-d', time()); }
public function preUpdate(Doctrine_Event $event)
{
$event->getInvoker()->updated = date('Y-m-d', time());
}
}
actAs()
ã¡ãœããã§ã¢ãã«ã«æ·»ä»ã§ããããã«TimestampTemplate
ãšããååã®åã®Doctrine_Template
ãäœããŸããã:
// models/TimestampBehavior.php
class TimestampTemplate extends Doctrine_Template { public function setTableDefinition() { $this->hasColumn('created', 'date'); $this->hasColumn('updated', 'date');
$this->setListener(new TimestampListener());
}
}
ã¿ã€ã ã¹ã¿ã³ãã®æ©èœãå¿
èŠãšããBlogPost
ã¯ã©ã¹ãèããŠã¿ãŸããããè¡ãå¿
èŠãããã®ã¯ã¯ã©ã¹ã®å®çŸ©ã«actAs()
ã®åŒã³åºãã远å ããããšã§ãã
class BlogPost extends Doctrine_Record
public function setTableDefinition()
{
$this->hasColumn('title', 'string', 200);
$this->hasColumn('body', 'clob');
}
public function setUp()
{
$this->actAs('TimestampBehavior');
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
BlogPost: actAs: [TimestampBehavior] columns: title: string(200) body:
clob
BlogPost
ã¢ãã«ã掻çšããããšãããšãcreated
ãšupdated
ã«ã©ã ã远å ããä¿åããããšãã«èªåçã«èšå®ãããããšãããããŸã:
$blogPost = new BlogPost(); $blogPost->title = 'Test'; $blogPost->body
= 'test'; $blogPost->save();
print_r($blogPost->toArray());
äžèšã®äŸã¯æ¬¡ã®åºåã衚瀺ããŸã:
$ php test.php Array ( [id] => 1 [title] => Test [body] => test
[created] => 2009-01-22 [updated] => 2009-01-22 )
NOTE äžèšã§èª¬æããæ©èœã¯æ¢ã«ã話ãã
Timestampable
ããã€ãã¢ãéããŠå©çšã§ããŸãããã®ç« ã®[doc behaviors:core-behaviors:timestampable :name]ã»ã¯ã·ã§ã³ã«æ»ã£ãŠè©³çްå 容ãèªãããšãã§ããŸãã
ãªã¬ãŒã·ã§ã³ä»ãã®ãã³ãã¬ãŒã
以åã®ç« ãããç¶æ³ã¯è€éã«ãªããã¡ã§ããä»ã®ã¢ãã«ã¯ã©ã¹ãžã®ãªã¬ãŒã·ã§ã³ãæã€ã¯ã©ã¹ãããä»»æã®ã¯ã©ã¹ãæ Œèª¿ãããã¯ã©ã¹ã§çœ®ãæãããããšããããŸãã
次ã®å®çŸ©ãæã€User
ãšEmail
ã®2ã€ã®ã¯ã©ã¹ãèããŠã¿ãŸããã:
class User extends Doctrine_Record { public function
setTableDefinition() { $this->hasColumn('username', 'string', 255); $this->hasColumn('password', 'string', 255); }
public function setUp()
{
$this->hasMany('Email', array(
'local' => 'id',
'foreign' => 'user_id'
)
);
}
}
class Email extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('address', 'string'); $this->hasColumn('user_id', 'integer'); }
public function setUp()
{
$this->hasOne('User', array(
'local' => 'user_id',
'foreign' => 'id'
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
User: columns: username: string(255) password: string(255)
Email: columns: address: string user_id: integer relations: User:
User
ãšEmail
ã¯ã©ã¹ãæ¡åŒµããäŸãã°ExtendedUser
ãšExtendedEmail
ã¯ã©ã¹ãäœãå ŽåãExtendedUser
ã¯Email
ã¯ã©ã¹ãžã®ãªã¬ãŒã·ã§ã³ãä¿åããŸããExtendedEmail
ã¯ã©ã¹ãžã®ãªã¬ãŒã·ã§ã³ã¯ä¿åããŸããããã¡ããUser
ã¯ã©ã¹ã®setUp()
ã¡ãœããããªãŒããŒã©ã€ãããŠExtendedEmail
ã¯ã©ã¹ãžã®ãªã¬ãŒã·ã§ã³ãå®çŸ©ããããšã¯ã§ããŸãããç¶æ¿ã®æ¬è³ªã倱ããŸããDoctrine_Template
ã¯ãã®åé¡ãäŸåãªããžã§ã¯ãã®æ³šå
¥(dependency
injection)ã®æ¹æ³ã§ãšã¬ã¬ã³ãã«è§£æ±ºããŸãã
次ã®äŸã§ã¯2ã€ã®ãã³ãã¬ãŒããUserTemplate
ãšEmailTemplate
ãUser
ãšEmail
ã¯ã©ã¹ãæã€ã»ãŒçæ³çãªå®çŸ©ã§å®çŸ©ããŸãã
// models/UserTemplate.php
class UserTemplate extends Doctrine_Template { public function setTableDefinition() { $this->hasColumn('username', 'string', 255); $this->hasColumn('password', 'string', 255); }
public function setUp()
{
$this->hasMany('EmailTemplate as Emails', array(
'local' => 'id',
'foreign' => 'user_id'
)
);
}
}
EmailTemplate
ãå®çŸ©ããŸããã:
// models/EmailTemplate.php
class EmailTemplate extends Doctrine_Template { public function setTableDefinition() { $this->hasColumn('address', 'string'); $this->hasColumn('user_id', 'integer'); }
public function setUp()
{
$this->hasOne('UserTemplate as User', array(
'local' => 'user_id',
'foreign' => 'id'
)
);
}
}
ãªã¬ãŒã·ã§ã³ã®èšå®æ¹æ³ã«æ³šç®ããŠãã ãããRecordå ·è±¡ã¯ã©ã¹ãæã瀺ãã®ã§ã¯ãªãããã³ãã¬ãŒããžã®ãªã¬ãŒã·ã§ã³ãèšå®ããŠããŸããããã¯Doctrineã«ãããã®ãã³ãã¬ãŒãçšã®Recordå ·è±¡ã¯ã©ã¹ãæ¢ãããã«äŒããŠããŸããDoctrineããããã®å ·è±¡ç¶æ¿ãèŠã€ããããªãå Žåãªã¬ãŒã·ã§ã³ããŒãµãŒã¯äŸå€ãæããŸãããåã«é²ãåã«ãå®éã®ã¬ã³ãŒãã¯ã©ã¹ã¯æ¬¡ã®éãã§ã:
class User extends Doctrine_Record { public function setUp() {
$this->actAs('UserTemplate'); } }
class Email extends Doctrine_Record { public function setUp() { $this->actAs('EmailTemplate'); } }
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
User: actAs: [UserTemplate]
Email: actAs: [EmailTemplate]
次ã®ã³ãŒãã¹ãããããèããŠã¿ãŸãããããã³ãã¬ãŒãçšã®å ·è±¡å®è£ ãèšå®ããŠããªãã®ã§ãã®ã³ãŒãã¹ããããã¯åããŸããã
// test.php
// ... $user = new User(); $user->Emails; // throws an exception
次ã®ããŒãžã§ã³ãåäœããŸããDoctrine_Manager
ã䜿çšããŠã°ããŒãã«ã«ãã³ãã¬ãŒãçšã®å
·è±¡å®è£
ã®èšå®ãããæ¹æ³ã泚ç®ããŠãã ãã:
// bootstrap.php
// ... $manager->setImpl('UserTemplate', 'User') ->setImpl('EmailTemplate', 'Email');
ãã®ã³ãŒãã¯åäœããŸãã以åã®ããã«äŸå€ãæããŸãã:
$user = new User(); $user->Emails[0]->address = '[email protected]';
$user->save();
print_r($user->toArray(true));
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php Array ( [id] => 1 [username] => [password] => [Emails]
=> Array ( [0] => Array ( [id] => 1 [address] => [email protected] [user_id] => 1 )
$ )
)
ãã³ãã¬ãŒãçšã®å®è£ ã¯ãããŒãžã£ãŒãæ¥ç¶ãšããŒãã«ã¬ãã«ã§ãèšå®ã§ããŸãã |
ããªã²ãŒãã¡ãœãã
ãã«ããŒãã«å®çŸ©ã®ããªã²ãŒãã·ã¹ãã ãšããŠæ¯ãèãããšã«å ããŠãDoctrine\_Template
ã¯ã¡ãœããã®åŒã³åºãã®ããªã²ãŒããå¯èœã«ããŸããããã¯ããŒãããããã³ãã¬ãŒãå
ã®ãã¹ãŠã®ã¡ãœããã¯ãã³ãã¬ãŒããããŒãããã¬ã³ãŒãã®äžã§å©çšã§ããããšãæå³ããŸãããã®æ©èœãå®çŸããããã«å
éšã§ã¯\__call()
ãšåŒã°ããããžãã¯ã¡ãœããã䜿çšãããŸãã
以åã®äŸã«UserTemplate
ã«ã«ã¹ã¿ã ã¡ãœããã远å ããŠã¿ãŸããã:
// models/UserTemplate.php
class UserTemplate extends Doctrine_Template { // ...
public function authenticate($username, $password)
{
$invoker = $this->getInvoker();
if ($invoker->username == $username && $invoker->password == $password) {
return true;
} else {
return false;
}
}
}
次ã®ã³ãŒãã§äœ¿ãæ¹ãèŠãŸããã:
$user = new User(); $user->username = 'jwage'; $user->password =
'changeme';
if ($user->authenticate('jwage', 'changemte')) { echo 'Authenticated successfully!'; } else { echo 'Could not authenticate user!'; }
Doctrine_Table
ã¯ã©ã¹ã«ã¡ãœãããããªã²ãŒãããããšãç°¡åã«ã§ããŸãããããååè¡çªãé¿ããããã«ãããŒãã«ã¯ã©ã¹çšã®ã¡ãœããã¯ã¡ãœããåã®æåŸã«è¿œå ãããTableProxy
ã®æååãæããªããã°ãªããŸããã
æ°ãããã¡ã€ã³ããŒã¡ãœããã远å ããäŸã¯æ¬¡ã®éãã§ã:
// models/UserTemplate.php
class UserTemplate extends Doctrine_Template { // ...
public function findUsersWithEmailTableProxy()
{
return Doctrine_Query::create()
->select('u.username')
->from('User u')
->innerJoin('u.Emails e')
->execute();
}
}
User
ã¢ãã«çšã®Doctrine_Table
ãªããžã§ã¯ãããã®ã¡ãœããã«ã¢ã¯ã»ã¹ã§ããŸã:
$userTable = Doctrine_Core::getTable('User');
$users = $userTable->findUsersWithEmail();
ããããã®ã¯ã©ã¹ã¯è€æ°ã®ãã³ãã¬ãŒãããæ§æãããŸãããã³ãã¬ãŒãã䌌ããããªå®çŸ©ãæ ŒçŽããå Žåææ°ã®ããŒãããããã³ãã¬ãŒã㯠åã®ãã®ãåžžã«ãªãŒããŒã©ã€ãããŸãã |
ããã€ãã¢ãäœæãã
ãã®ç¯ã§ã¯ç¬èªããã€ãã¢äœæçšã®æ¹æ³ã説æããŸããäžå¯Ÿå€ã®Eã¡ãŒã«ãå¿ èŠãªæ§ã ãªRecordã¯ã©ã¹ãèããŠã¿ãŸããããEmailã¯ã©ã¹ãå³åº§ã«äœæããäžè¬çãªããã€ãã¢ãäœæããããšã§ãã®æ©èœãå®çŸããŸãã
EmailBehavior
ãšåŒã°ããããã€ãã¢ãsetTableDefinition()
ã¡ãœããã§äœæããããšãããã®ã¿ã¹ã¯ãå§ããŸããsetTableDefinition()
ã¡ãœããã®å
éšã§ã¯åçãªã¬ã³ãŒãã®å®çŸ©ã«æ§ã
ãªãã«ããŒã¡ãœããã䜿ãããŸããæ¬¡ã®ã¡ãœãããå
±éã§äœ¿ãããŠããŸã:
public function initOptions() public function buildLocalRelation()
public function buildForeignKeys(Doctrine_Table `table) public function buildForeignRelation(` alias = null)public function buildRelation() // buildForeignRelation()ãšbuildLocalRelation()ãåŒã³åºã
class EmailBehavior extends Doctrine_Record_Generator { public
function initOptions() { $this->setOption('className', '%CLASS%Email');
// ã»ãã®ãªãã·ã§ã³
// $this->setOption('appLevelDelete', true);
// $this->setOption('cascadeDelete', false);
}
public function buildRelation()
{
$this->buildForeignRelation('Emails');
$this->buildLocalRelation();
}
public function setTableDefinition()
{
$this->hasColumn('address', 'string', 255, array(
'email' => true,
'primary' => true
)
);
}
}
ã³ã¢ããã€ãã¢
ã³ã¢ããã€ãã¢ãäœ¿ãæ¬¡ã®ããã€ãã®äŸã®ããã«ä»¥åã®ç« ã§äœæãããã¹ãç°å¢ããæ¢åã®ã¹ããŒããšã¢ãã«ããã¹ãŠåé€ããŸãããã
$ rm schema.yml $ touch schema.yml $ rm -rf models/*
玹ä»
Doctrineã«ã¯ã¢ãã«ã«ãã®ãŸãŸäœ¿ããæ©èœãæäŸãããã³ãã¬ãŒããæèŒãããŠããŸããã¢ãã«ã§ãããã®ãã³ãã¬ãŒããç°¡åã«æå¹ã«ã§ããŸããDoctrine_Records
ã§çŽæ¥è¡ããããã¯YAMLã§ã¢ãã«ã管çããŠããã®ã§ããã°ããããYAMLã¹ããŒãã§æå®ã§ããŸãã
次ã®äŸã§ã¯Doctrineã«æèŒãããŠããããã€ãã¢ã®äžéšã宿ŒããŸãã
Versionable
ããŒãžã§ã³ç®¡çã®æ©èœãæãããããã«BlogPost
ã¢ãã«ãäœæããŸããã:
// models/BlogPost.php
class BlogPost extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('title', 'string', 255); $this->hasColumn('body', 'clob'); }
public function setUp()
{
$this->actAs('Versionable', array(
'versionColumn' => 'version',
'className' => '%CLASS%Version',
'auditLog' => true
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
BlogPost: actAs: Versionable: versionColumn: version className:
%CLASS%Version auditLog: true columns: title: string(255) body: clob
NOTE
auditLog
ãªãã·ã§ã³ã¯auditã®ãã°å±¥æŽãç¡å¹ã«ããããã«äœ¿ãããŸããããã¯ããŒãžã§ã³çªå·ãç¶æããããããããã®ããŒãžã§ã³ã§ã®ããŒã¿ãç¶æããããªãå Žåã«äœ¿ããŸãã
äžèšã®ã¢ãã«ã§çæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('BlogPost')); echo $sql[0] . ; echo $sql[1];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
CREATE TABLE blog_post_version (id BIGINT, title VARCHAR(255), body
LONGTEXT, version BIGINT, PRIMARY KEY(id, version)) ENGINE = INNODB CREATE TABLE blog_post (id BIGINT AUTO_INCREMENT, title VARCHAR(255), body LONGTEXT, version BIGINT, PRIMARY KEY(id)) ENGINE = INNODB ALTER TABLE blog_post_version ADD FOREIGN KEY (id) REFERENCES blog_post(id) ON UPDATE CASCADE ON DELETE CASCADE
NOTE ããããäºæããŠããªãã£ãã§ããã2ã®è¿œå ã¹ããŒãã¡ã³ããããããšã«æ³šç®ããŠãã ãããããã€ãã¢ã¯èªåçã«
blog\_post\_version
ããŒãã«ãäœæããããblog_post
ã«é¢é£ä»ããŸãã
BlogPost
ãæ¿å
¥ãããã¯æŽæ°ãããšãããŒãžã§ã³ããŒãã«ã¯å€ãããŒãžã§ã³ã®ã¬ã³ãŒãããã¹ãŠä¿åããŠãã€ã§ãå·®ãæ»ãã§ããããã«ããŸããæåã«NewsItem
ãã€ã³ã¹ã¿ã³ã¹åãããšãå
éšã§èµ·ããŠããããšã¯æ¬¡ã®éãã§ã:
BlogPostVersion
ãšããååã®ã¯ã©ã¹ãå³åº§ã«äœæããããã¬ã³ãŒããæã瀺ãããŒãã«ã¯blog\_post_version
ã§ããBlogPost
ãªããžã§ã¯ããåé€/æŽæ°ããããã³ã«ä»¥åã®ããŒãžã§ã³ã¯blog\_post_version
ã«ä¿åãããBlogPost
ãªããžã§ã¯ããæŽæ°ããããã³ã«ããŒãžã§ã³çªå·ãå¢ããã
BlogPost
ã¢ãã«ã§éã³ãŸããã:
$blogPost = new BlogPost(); $blogPost->title = 'Test blog post';
$blogPost->body = 'test'; $blogPost->save();
$blogPost->title = 'Modified blog post title'; $blogPost->save();
print_r($blogPost->toArray());
äžèšã®äŸã§ã¯æ¬¡ã®å 容ãåºåãããŸã:
$ php test.php Array ( [id] => 1 [title] => Modified blog post title
[body] => test [version] => 2 )
NOTE
version
ã«ã©ã ã®å€ã2
ã§ããããšã«æ³šç®ããŠãã ããã2ã€ã®ããŒãžã§ã³ã®BlogPost
ã¢ãã«ãä¿åããããã§ããããã€ãã¢ãæ ŒçŽããrevert()
ã¡ãœããã䜿çšããããšã§å¥ã®ããŒãžã§ã³ã«å·®ãæ»ãããšãã§ããŸãã
æåã®ããŒãžã§ã³ã«å·®ãæ»ããŠã¿ãŸããã:
`blogPost->revert(1); print_r(` blogPost->toArray());
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåãã:
$ php test.php Array ( [id] => 2 [title] => Test blog post [body] =>
test [version] => 1 )
NOTE
version
ã«ã©ã ã®å€ã1ã«èšå®ããtitle
ã¯BlogPost
ãäœæãããšãã«èšå®ããããªãªãžãã«ã®å€ã«æ»ããŸãã
Timestampable
Timestampableããã€ãã¢ã¯created\_at
ãšupdated_at
ã«ã©ã ã远å ãã¬ã³ãŒããæ¿å
¥ãšæŽæ°ããããšãã«å€ãèªåçã«èšå®ããŸãã
æ¥ä»ãç¥ãããšã¯å
±éã®ããŒãºãªã®ã§BlogPost
ã¢ãã«ãå±éããŠãããã®æ¥ä»ãèªåçã«èšå®ããããã«Timestampable
ããã€ãã¢ã远å ããŸãã
// models/BlogPost.php
class BlogPost extends Doctrine_Record { // ...
public function setUp()
{
$this->actAs('Timestampable');
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
# schema.yml
BlogPost: actAs: # ... Timestampable: # ...
updated\_at
ãã£ãŒã«ãã§ã¯ãªãcreated_at
ã¿ã€ã ã¹ã¿ã³ããšãã£ãã«ã©ã ã®1ã€ã ãã䜿ãããšã«èå³ãããã®ã§ããã°ãäžèšã®äŸã®ããã«ãã£ãŒã«ãã®ã©ã¡ããã«å¯ŸããŠdisabled
ãtrueã«èšå®ããŸãã
BlogPost: actAs: # ... Timestampable: created: name: created_at type:
timestamp format: Y-m-d H:i:s updated: disabled: true # ...
æ°ããæçš¿ãäœæãããšãã«äœãèµ·ããã®ãèŠãŠã¿ãŸããã:
$blogPost = new BlogPost(); $blogPost->title = 'Test blog post';
$blogPost->body = 'test'; $blogPost->save();
print_r($blogPost->toArray());
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php Array ( [id] => 1 [title] => Test blog post [body] =>
test [version] => 1 [created_at] => 2009-01-21 17:54:23 [updated_at] => 2009-01-21 17:54:23 )
NOTE
created\_at
ãšupdated_at
ã®å€ãèªåçã«èšå®ãããããšã«æ³šç®ããŠãã ããïŒ
ããã€ãã¢ã®äœæåŽã®Timestampable
ããã€ãã¢ã§äœ¿ãããšãã§ãããã¹ãŠã®ãªãã·ã§ã³ã®ãªã¹ãã§ã:
|
äœæåŽã§ã¯äžå¯èœãªæŽæ°åŽã®ããã€ãã¢ã§Timestampable
ããã€ãã¢ã§äœ¿ãããšãã§ãããã¹ãŠã®ãªãã·ã§ã³ã®ãªã¹ãã¯æ¬¡ã®éãã§ã:
|
Sluggable
Sluggable
ããã€ãã¢ã¯çŽ æŽãããæ©èœã®1ã€ã§ã¿ã€ãã«ãé¡ç®ãªã©ã®ã«ã©ã ããäœæã§ãã人éãèªè§£ã§ãããŠããŒã¯ãªèå¥åãä¿åããããã«ã¢ãã«ã«ã«ã©ã ãèªåçã«è¿œå ããŸãããããã®å€ã¯æ€çŽ¢ãšã³ãžã³ã«ãã¬ã³ããªãŒãªURLã«äœ¿ãããšãã§ããŸãã
æçš¿èšäºçšã®ããããããURLãæ¬²ããã®ã§Sluggable
ããã€ãã¢ã䜿ãããã«BlogPost
ã¢ãã«ãæ¡åŒµããŠã¿ãŸããã:
// models/BlogPost.php
class BlogPost extends Doctrine_Record { // ...
public function setUp()
{
// ...
$this->actAs('Sluggable', array(
'unique' => true,
'fields' => array('title'),
'canUpdate' => true
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
# schema.yml
BlogPost: actAs: # ... Sluggable: unique: true fields: [title] canUpdate: true # ...
æ°ããæçš¿ãäœæããéã«äœãèµ·ããã®ãèŠãŠã¿ãŸããããslugã«ã©ã ã¯èªåçã«èšå®ãããŸã:
$blogPost = new BlogPost(); $blogPost->title = 'Test blog post';
$blogPost->body = 'test'; $blogPost->save();
print_r($blogPost->toArray());
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php Array ( [id] => 1 [title] => Test blog post [body] =>
test [version] => 1 [created_at] => 2009-01-21 17:57:05 [updated_at] => 2009-01-21 17:57:05 [slug] => test-blog-post )
NOTE
title
ã«ã©ã ã®å€ã«åºã¥ããŠslug
ã«ã©ã ã®å€ãèªåçã«èšå®ãããããšã«æ³šç®ããŠãã ãããã¹ã©ãã°ãäœæããããšããããã©ã«ãã§ã¯urlized
ã䜿ãããŸããããã¯URLã«ãã¬ã³ããªãŒã§ã¯ãªãæåã¯åé€ãããã¯ã€ãã¹ããŒã¹ã¯ãã€ãã³(-)ã«çœ®ãæããããŸãã
uniqueãã©ã°ã¯äœæãããã¹ã©ãã°ããŠããŒã¯ã§ããããšã匷å¶ããŸãããŠããŒã¯ã§ã¯ãªãå ŽåããŒã¿ããŒã¹ã«ä¿åãããåã«auto incrementãªæŽæ°ãã¹ã©ãã°ã«èªåçã«è¿œå ãããŸãã
canUpdate
ãã©ã°ã¯urlãã¬ã³ããªãŒãªã¹ã©ãã°ãçæããéã«ãŠãŒã¶ãŒã䜿çšããã¹ã©ãã°ãèªåçã«èšå®ããããšãèš±å¯ããŸãã
Sluggable
ããã€ãã¢ã§äœ¿ãããšãã§ãããã¹ãŠã®ãªãã·ã§ã³ã®ãªã¹ãã¯æ¬¡ã®éãã§ã:
|
I18n
Doctrine_I18n
ããã±ãŒãžã¯ã¬ã³ãŒãã¯ã©ã¹çšã®åœéåãµããŒããæäŸããããã€ãã¢ã§ããæ¬¡ã®äŸã§ã¯title
ãšcontent
ã®2ã€ã®ãã£ãŒã«ããæã€NewsItem
ã¯ã©ã¹ããããŸããç°ãªãèšèªãµããŒããæã€title
ãã£ãŒã«ããçšæãããå ŽåãèããŸããããã¯æ¬¡ã®ããã«å®çŸã§ããŸã:
class NewsItem extends Doctrine_Record { public function
setTableDefinition() { $this->hasColumn('title', 'string', 255); $this->hasColumn('body', 'blog'); }
public function setUp()
{
$this->actAs('I18n', array(
'fields' => array('title', 'body')
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
NewsItem: actAs: I18n: fields: [title, body] columns: title:
string(255) body: clob
I18n
ããã€ãã¢ã§äœ¿ãããšãã§ãããã¹ãŠã®ãªãã·ã§ã³ã®ãªã¹ãã¯æ¬¡ã®éãã§ã:
|
äžèšã®ã¢ãã«ã§çæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('NewsItem')); echo $sql[0] . ; echo $sql[1];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLãåºåããŸã:
CREATE TABLE news_item_translation (id BIGINT, title VARCHAR(255),
body LONGTEXT, lang CHAR(2), PRIMARY KEY(id, lang)) ENGINE = INNODB CREATE TABLE news_item (id BIGINT AUTO_INCREMENT, PRIMARY KEY(id)) ENGINE = INNODB
NOTE
title
ãã£ãŒã«ããnews_item
ããŒãã«ã«ååšããªãããšã«æ³šç®ããŠãã ããã翻蚳ããŒãã«ã«ãããšã¡ã€ã³ããŒãã«ã§åããã£ãŒã«ããååšããŠãªãœãŒã¹ã®ç¡é§é£ãã«ãªãããã§ããåºæ¬çã«Doctrineã¯åžžã«ã¡ã€ã³ããŒãã«ãã翻蚳ããããã£ãŒã«ãããã¹ãŠåé€ããŸãã
åããŠæ°ããNewsItem
ã¬ã³ãŒããåæåãããšãDoctrineã¯æ¬¡ã®å
容ããã«ãããããã€ãã¢ãåæåããŸã:
NewsItemTranslation
ãšåŒã°ããRecordã¯ã©ã¹NewsItemTranslation
ãšNewsItem
ã®åæ¹åãªãªã¬ãŒã·ã§ã³
NewsItem
ã®ç¿»èš³ãæäœããæ¹æ³ãèŠãŠã¿ãŸããã:
// test.php
// ... $newsItem = new NewsItem(); $newsItem->Translation['en']->title = 'some title'; $newsItem->Translation['en']->body = 'test'; $newsItem->Translation['fi']->title = 'joku otsikko'; $newsItem->Translation['fi']->body = 'test'; $newsItem->save();
print_r($newsItem->toArray());
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php Array ( [id] => 1 [Translation] => Array ( [en] => Array
( [id] => 1 [title] => some title [body] => test [lang] => en ) [fi] => Array ( [id] => 1 [title] => joku otsikko [body] => test [lang] => fi )
$ )
)
翻蚳ããŒã¿ãã©ã®ããã«èªã¿åãã®ã§ããããïŒããã¯ç°¡åã§ãïŒãã¹ãŠã®é ç®ãèŠã€ããŠç¿»èš³ãçµããããŸããã:
// test.php
// ... $newsItems = Doctrine_Query::create() ->from('NewsItem n') ->leftJoin('n.Translation t') ->where('t.lang = ?') ->execute(array('fi'));
echo $newsItems[0]->Translation['fi']->title;
äžèšã®ã³ãŒãã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php joku otsikko
NestedSet
NestedSet
ããã€ãã¢ã«ãã£ãŠã¢ãã«ãå
¥ãåéåããªãŒæ§é (nested set
tree
structure)ã«å€æã§ããŸããããªãŒæ§é å
šäœã1ã€ã®ã¯ãšãªã§å¹ççã«èªã¿åãããšãã§ããŸãããã®ããã€ãã¢ã¯ããªãŒã®ããŒã¿ãæäœããããã®çŽ æŽãããã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
äŸãšããŠCategory
ã¢ãã«ãèããŠã¿ãŸããããã«ããŽãªãéå±€ããªãŒæ§é ã§ç·šæããå¿
èŠãããå Žåã¯æ¬¡ã®ããã«ãªããŸã:
// models/Category.php
class Category extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('name', 'string', 255); }
public function setUp()
{
$this->actAs('NestedSet', array(
'hasManyRoots' => true,
'rootColumnName' => 'root_id'
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
# schema.yml
Category: actAs: NestedSet: hasManyRoots: true rootColumnName: root_id columns: name: string(255)
äžèšã®ã¢ãã«ã§çæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('Category')); echo $sql[0];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
CREATE TABLE category (id BIGINT AUTO_INCREMENT, name VARCHAR(255),
root_id INT, lft INT, rgt INT, level SMALLINT, PRIMARY KEY(id)) ENGINE = INNODB
NOTE
root_id
ãlft
ãrgt
ãšlevel
ã«ã©ã ãèªåçã«è¿œå ãããããšã«æ³šç®ããŠãã ããããããã®ã«ã©ã ã¯ããªãŒæ§é ãç·šæããŠå éšã®èªååŠçã«äœ¿ãããŸãã
ããã§ã¯NestedSet
ããã€ãã¢ã®100ïŒ
ãæ€èšããŸããããšãŠã倧ããªããã€ãã¢ãªã®ã§[doc
hierarchical-data å°çšã®ç« ]ããããŸãã
Searchable
Searchable
ããã€ãã¢ã¯å
šæã€ã³ããã¯ã¹äœæãšæ€çŽ¢æ©èœãæäŸããŸããããŒã¿ããŒã¹ãšãã¡ã€ã«ã®äž¡æ¹ã®ã€ã³ããã¯ã¹ãšæ€çŽ¢ã«äœ¿ãããŸãã
æ±äººæçš¿çšã®Job
ã¢ãã«ãããç°¡åã«æ€çŽ¢ã§ããããã«ããããšãèããŠã¿ãŸããã:
// models/Job.php
class Job extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('title', 'string', 255); $this->hasColumn('description', 'clob'); }
public function setUp()
{
$this->actAs('Searchable', array(
'fields' => array('title', 'content')
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
Job: actAs: Searchable: fields: [title, description] columns: title:
string(255) description: clob
äžèšã®ã¢ãã«ã§çæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('Job')); echo $sql[0] . ; echo $sql[1] . ; echo $sql[2];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
CREATE TABLE job_index (id BIGINT, keyword VARCHAR(200), field
VARCHAR(50), position BIGINT, PRIMARY KEY(id, keyword, field, position)) ENGINE = INNODB CREATE TABLE job (id BIGINT AUTO_INCREMENT, title VARCHAR(255), description LONGTEXT, PRIMARY KEY(id)) ENGINE = INNODB ALTER TABLE job_index ADD FOREIGN KEY (id) REFERENCES job(id) ON UPDATE CASCADE ON DELETE CASCADE
NOTE
job\_index
ããŒãã«ããã³job
ãšjob_index
ã®éã®å€éšããŒãèªåçã«çæãããããšã«æ³šç®ããŠãã ããã
Searchable
ããã€ãã¢ã¯éåžžã«å€§ããªãããã¯ãªã®ã§ã詳现ã¯[doc
searching :name]ã®ç« ã§èŠã€ãããŸãã
Geographical
äžèšã®ã³ãŒãã¯ãã¢ã®ã¿ã§ããGeographicalããã€ãã¢ã¯2ã€ã®ã¬ã³ãŒãã®éã®ãã€ã«ãããã¯ããã¡ãŒã¿ã®æ°å€ã決å®ããããã®ã¬ã³ãŒãããŒã¿ã§äœ¿ãããšãã§ããŸãã
// models/Zipcode.php
class Zipcode extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('zipcode', 'string', 255); $this->hasColumn('city', 'string', 255); $this->hasColumn('state', 'string', 2); $this->hasColumn('county', 'string', 255); $this->hasColumn('zip_class', 'string', 255); }
public function setUp()
{
$this->actAs('Geographical');
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
# schema.yml
Zipcode: actAs: [Geographical] columns: zipcode: string(255) city: string(255) state: string(2) county: string(255) zip_class: string(255)
äžèšã®ã¢ãã«ã§çæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('Zipcode')); echo $sql[0];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
CREATE TABLE zipcode (id BIGINT AUTO_INCREMENT, zipcode VARCHAR(255),
city VARCHAR(255), state VARCHAR(2), county VARCHAR(255), zip_class VARCHAR(255), latitude DOUBLE, longitude DOUBLE, PRIMARY KEY(id)) ENGINE = INNODB
NOTE Geographicalããã€ãã¢ã2ã€ã®ã¬ã³ãŒãã®è·é¢ãç®åºããããã«äœ¿ãããã¬ã³ãŒãã«
latitude
ãšlongitude
ã«ã©ã ãèªåçã«è¿œå ããããšã«æ³šç®ããŠãã ãããäœ¿ãæ¹ã®äŸã¯äžèšã®éãã§ãã
æåã«2ã€ã®ç°ãªãzipcodeã¬ã³ãŒããèªã¿åããŸããã:
// test.php
// ... $zipcode1 = Doctrine_Core::getTable('Zipcode')->findOneByZipcode('37209'); $zipcode2 = Doctrine_Core::getTable('Zipcode')->findOneByZipcode('37388');
ããã€ãã¢ãæäŸããgetDistance()
ã¡ãœããã䜿çšããŠããã2ã€ã®ã¬ã³ãŒãã®éã®è·é¢ãååŸã§ããŸã:
// test.php
// ... echo `zipcode1->getDistance(` zipcode2, $kilometers =false);
NOTE
getDistance()
ã¡ãœããã®2çªç®ã®åŒæ°ã¯ããã¡ãŒã¿ãŒã§è·é¢ãè¿ããã©ããã§ããããã©ã«ãã¯falseã§ãã
åãåžã«ã¯ãªã50ã®è¿ãzipcodeãååŸããŠã¿ãŸããã:
// test.php
// ... $q = $zipcode1->getDistanceQuery();
`q->orderby('miles asc') ->addWhere(` q->getRootAlias() . '.city!= ?', $zipcode1->city) ->limit(50);
echo $q->getSqlQuery();
getSql()
ãžã®äžèšã®åŒã³åºãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
SELECT z.id AS zid, z.zipcode AS zzipcode, z.city AS z**city,
z.state AS zstate, z.county AS zcounty, z.zip_class AS zzip_class, z.latitude AS zlatitude, z.longitude AS zlongitude, ((ACOS(SIN( PI() / 180) SIN(z.latitude PI() / 180) + COS( PI() / 180) COS(z.latitude PI() / 180) COS((- z.longitude) PI() / 180)) 180 / PI()) 60 1.1515) AS z0, ((ACOS(SIN( PI() / 180) SIN(z.latitude PI() / 180) + COS( PI() / 180) COS(z.latitude PI() / 180) COS((- z.longitude) PI() / 180)) 180 / PI()) 60 1.1515 1.609344) AS z*1 FROM zipcode z WHERE z.city != ? ORDER BY z__0 asc LIMIT 50
NOTE äžèšã®SQLã¯ãšãªãæžããªãã£ãSQLã®æãå«ãã§ããããšã«æ³šç®ããŠãã ãããããã¯ã¬ã³ãŒãã®éã®ãã€ã«æ°ãèšç®ããããã«ããã€ãã¢ã«ãã£ãŠèªåçã«è¿œå ãããŸãã
ã¯ãšãªãå®è¡ããŠç®åºããããã€ã«æ°ã®å€ã䜿çšããŸã:
// test.php
// ... $result = $q->execute();
foreach ($result as $zipcode) { echo $zipcode->city . - . $zipcode->miles . ; // You could also access $zipcode->kilometers }
ããããã¹ãããããã«ãµã³ãã«ã®zipcodeãååŸããŸã
http://www.populardata.com/zip_codes.zip
csvãã¡ã€ã«ãããŠã³ããŒãããŠæ¬¡ã®é¢æ°ã§ã€ã³ããŒãããŠãã ãã:
// test.php
// ... function parseCsvFile($file, $columnheadings = false, $delimiter = ',', $enclosure = ) { $row = 1; $rows = array(); `handle = fopen(` file, 'r');
while (($data = fgetcsv($handle, 1000, $delimiter, $enclosure)) !== FALSE) {
if (!($columnheadings == false) && ($row == 1)) {
$headingTexts = $data;
} elseif (!($columnheadings == false)) {
foreach ($data as $key => $value) {
unset($data[$key]);
$data[$headingTexts[$key]] = $value;
}
$rows[] = $data;
} else {
$rows[] = $data;
}
$row++;
}
fclose($handle);
return $rows;
}
$array = parseCsvFile('zipcodes.csv', false);
SoftDelete
SoftDelete
ããã€ãã¢ã¯delete()
æ©èœããªãŒããŒã©ã€ããdeleted
ã«ã©ã ã远å ãããšãŠãã·ã³ãã«ã ã倧ãã«ããããã§ããã¢ãã«ããã€ãã¢ã§ããdelete()
ãåŒã³åºããããšããããŒã¿ããŒã¹ããã¬ã³ãŒããåé€ãã代ããã«ãåé€ãã©ã°ã1ã«ã»ããããŸããäžèšã®ã³ãŒãã¯SoftDelete
ããã€ãã¢ã§ã¢ãã«ãäœãæ¹æ³ã§ãã
// models/SoftDeleteTest.php
class SoftDeleteTest extends Doctrine_Record { public function setTableDefinition() { $this->hasColumn('name', 'string', null, array( 'primary' => true ) ); }
public function setUp()
{
$this->actAs('SoftDelete');
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
# schema.yml
SoftDeleteTest: actAs: [SoftDelete] columns: name: type: string(255) primary: true
äžèšã®ã¢ãã«ã«ãã£ãŠçæãããSQLããã§ãã¯ããŠã¿ãŸããã:
// test.php
// ... $sql = Doctrine_Core::generateSqlFromArray(array('SoftDeleteTest')); echo $sql[0];
äžèšã®ã³ãŒãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
CREATE TABLE soft_delete_test (name VARCHAR(255), deleted TINYINT(1)
DEFAULT '0' NOT NULL, PRIMARY KEY(name)) ENGINE = INNODB
ããã€ãã¢ãåãããŠã¿ãŸãããã
NOTE ãã¹ãŠã®å®è¡ãããã¯ãšãªã®ããã«DQLã³ãŒã«ããã¯ãæåã«ããå¿ èŠããããŸãã
SoftDelete
ããã€ãã¢ã«ãããŠè¿œå ã®WHEREæ¡ä»¶ã§deleted_at
ãã©ã°ãèšå®ãããŠãããã¹ãŠã®ã¬ã³ãŒããé€å€ããSELECTæããã£ã«ã¿ãªã³ã°ããããã«äœ¿ãããŸãã
DQLã³ãŒã«ããã¯ãæå¹ã«ãã
// bootstrap.php
// ... $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
SoftDelete
ã®æ©èœãå®è¡ã§ããããã«æ°ããã¬ã³ãŒããä¿åããŸã:
// test.php
// ... $record = new SoftDeleteTest(); $record->name = 'new record'; $record->save();
delete()
ãåŒã³åºããšãdeleted
ãã©ã°ãtrue
ã«ã»ãããããŸã:
// test.php
// ... $record->delete();
print_r($record->toArray());
äžèšã®äŸã¯æ¬¡ã®å 容ãåºåããŸã:
$ php test.php Array ( [name] => new record [deleted] => 1 )
ãŸããã¯ãšãªãè¡ããšããdeleted
ãnullã§ã¯ãªãã¬ã³ãŒãã¯çµæããé€å€ãããŸã:
// test.php
// ... $q = Doctrine_Query::create() ->from('SoftDeleteTest t');
echo $q->getSqlQuery();
getSql()
ã®åŒã³åºãã¯æ¬¡ã®SQLã¯ãšãªãåºåããŸã:
SELECT s.name AS sname, s.deleted AS sdeleted FROM
soft_delete_test s WHERE (s.deleted = ? OR s.deleted IS NULL)
NOTE åé€ãããŠããªãã¬ã³ãŒãã ããè¿ãããã«whereæ¡ä»¶ãèªåçã«è¿œå ãããããšã«æ³šç®ããŠãã ããã
ã¯ãšãªãå®è¡ããå Žå:
// test.php
// ... $count = $q->count(); echo $count;
äžèšã®ã³ãŒã0ãechoããŸããdeleteãã©ã°ãèšå®ãããã®ã§ä¿åãããã¬ã³ãŒããé€å€ãããŸãã
å ¥ãåã®ããã€ãã¢
versionableãsearchableãsluggableããšå®å šãªI18nã§ããå®å šãªwikiããŒã¿ããŒã¹ãäžããè€æ°ã®ããã€ãã¢ã®äŸã§ãã
class Wiki extends Doctrine_Record { public function
setTableDefinition() { $this->hasColumn('title', 'string', 255); $this->hasColumn('content', 'string'); }
public function setUp()
{
$options = array('fields' => array('title', 'content'));
$auditLog = new Doctrine_Template_Versionable($options);
$search = new Doctrine_Template_Searchable($options);
$slug = new Doctrine_Template_Sluggable(array(
'fields' => array('title')
)
);
$i18n = new Doctrine_Template_I18n($options);
$i18n->addChild($auditLog)
->addChild($search)
->addChild($slug);
$this->actAs($i18n);
$this->actAs('Timestampable');
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
WikiTest: actAs: I18n: fields: [title, content] actAs: Versionable:
fields: [title, content] Searchable: fields: [title, content] Sluggable: fields: [title] columns: title: string(255) content: string
çŸåšäžèšã®å ¥ãåã®ããã€ãã¢ã¯å£ããŠããŸããéçºè ã¯åŸæ¹äºææ§ãä¿®æ£ããããã«æžåœã«åãçµãã§ããŸããä¿®æ£ãã§ãããšãã«ã¢ããŠã³ã¹ãè¡ãããã¥ã¡ã³ããæŽæ°ããŸãã |
ãã¡ã€ã«ãçæãã
ããã©ã«ãã§ã¯ããã€ãã¢ã«ãã£ãŠçæãããã¯ã©ã¹ã¯å®è¡æã«è©äŸ¡ããã¯ã©ã¹ãæ ŒçŽãããã¡ã€ã«ã¯ãã£ã¹ã¯ã«æžã蟌ãŸããŸãããããã¯èšå®ãªãã·ã§ã³ã§å€æŽã§ããŸããäžèšã®ã³ãŒãã¯å®è¡æã«ã¯ã©ã¹ãè©äŸ¡ãã代ããã«ã¯ã©ã¹ãçæããŠãã¡ã€ã«ã«æžã蟌ãããã®I18nããã€ãã¢ãèšå®ããæ¹æ³ã®äŸã§ãã
class NewsArticle extends Doctrine_Record { public function
setTableDefinition() { $this->hasColumn('title', 'string', 255); $this->hasColumn('body', 'string', 255); $this->hasColumn('author', 'string', 255); }
public function setUp()
{
$this->actAs('I18n', array(
'fields' => array('title', 'body'),
'generateFiles' => true,
'generatePath' => '/path/to/generate'
)
);
}
}
YAMLãã©ãŒãããã§ã®äŸã¯æ¬¡ã®éãã§ãã[doc yaml-schema-files :name]ã®ç« ã§YAMLã®è©³çްãèªãããšãã§ããŸã:
NewsArticle: actAs: I18n: fields: [title, body] generateFiles: true
generatePath: /path/to/generate columns: title: string(255) body: string(255) author: string(255)
ã³ãŒããçæããŠå®è¡æã«è©äŸ¡ããããã«[http://www.php.net/eval
eval()]
ã䜿çšãã代ããã«ããã§ããã€ãã¢ã¯ãã¡ã€ã«ãçæããŸãã
çæã¯ã©ã¹ãã¯ãšãªãã
èªåçæã¢ãã«ãã¯ãšãªãããå Žåæ·»ä»ãããã¢ãã«ãæã€ã¢ãã«ãããŒãããåæåãããããšã確èªããå¿
èŠããããŸããDoctrine_Core::initializeModels()
ã¹ã¿ãã£ãã¯ã¡ãœããã䜿çšããããšã§ãããã§ããŸããäŸãã°BlogPost
ã¢ãã«çšã®ç¿»èš³ããŒãã«ã«ã¯ãšãªããããå Žåãæ¬¡ã®ã³ãŒããå®è¡ããå¿
èŠããããŸã:
Doctrine_Core::initializeModels(array('BlogPost'));
$q = Doctrine_Query::create() ->from('BlogPostTranslation t') ->where('t.id = ? AND t.lang = ?', array(1, 'en'));
$translations = $q->execute();
ã¢ãã«ãæåã«ã€ã³ã¹ã¿ã³ã¹åããããŸã§ããã€ãã¢ã¯ã€ã³ã¹ã¿ã³ã¹åãããªãã®ã§ããã¯å¿
é ã§ããäžèšã® |
ãŸãšã
Doctrineããã€ãã¢ã«ã€ããŠå€ãã®ããšãåŠã³ãŸããDoctrineã«æèŒãããŠããçŽ æŽãããããã€ãã¢ã®äœ¿ãæ¹ãšåãããã«ã¢ãã«çšã®ç¬èªããã€ãã¢ã®æžãæ¹ãåŠã³ãŸãã
[doc searching Searchable]ããã€ãã¢ã詳ããæ€èšããããã«ç§»åããæºåãã§ããŠããŸããããã¯å€§ããªãããã¯ãªã®ã§å°éã®ç« ãçšæãããŠããŸãã