Repository navigation
french Complete Examples
Créez quelques migrations, qui vont créer un lot de tables et modifier des données existantes.
phigrate-generate create_users_table
phigrate-generate create_posts_table
phigrate-generate fix_dangling_phones_data_bug
phigrate-generate add_deleted_at_column_to_posts_tableEn supposant que ce sont les premières migrations dans le système, les commandes ci-dessus vont créer des fichiers tels que:
db/migrate/20100909133617_CreateUsersTable.php
db/migrate/20100909133814_CreatePostsTable.php
db/migrate/20100909133840_FixDanglingPhonesDataBug.php
db/migrate/20100909133987_AddDeletedAtColumnToPostsTable.phpVoyons le contenu du fichier db/migrate/20100909133617_CreateUsersTable.php:
<?php
class CreateUsersTable extends Phigrate_Migration_Base
{
public function up()
{
$t = $this->createTable("users", array("id" => false))
->column("user_id", "integer", array("primary_key" => true,
"auto_increment" => true,
"unsigned" => true,
"null" => false))
->column("first_name", "string")
->column("last_name", "string")
->column("email", "string", array("limit" => 128))
->column("title", "string")
->finish();
$this->addIndex("users", "email", array("unique" => true));
}//up()
public function down()
{
$this->removeIndex('users', 'email');
$this->dropTable("users");
}//down()
}Le contenu du fichier db/migrate/20100909133814_CreatePostsTable.php pourrait
être le suivant.
Note: Nous allons créer une clef primaire à deux colonnes.
<?php
class CreatePostsTable extends Phigrate_Migration_Base
{
public function up()
{
$t = $this->createTable("posts", array("id" => false))
->column("post_id", "integer", array(
"null" => false,
"primary_key" => true))
->column("subject", "string")
->column("body", "string")
->column("created_at", "datetime", array(
'null' => false,
"primary_key" => true))
->column("author_id", "integer");
->finish();
$this->addIndex("posts", "author_id");
}//up()
public function down()
{
$this->removeIndex("posts", "author_id");
$this->dropTable("posts");
}//down()
}
?>Le contenu du fichier db/migrate/20100909133840_FixDanglingPhonesDataBug.php
pourrait être:
<?php
class FixDanglingPhonesDataBug extends Phigrate_Migration_Base
{
public function up()
{
$this->execute("UPDATE phones SET area_code = '415' WHERE area_code IS NULL");
}//up()
public function down()
{
//Nothing to do. Data was wrong due to bug (#3461), so lets just fix
// it once and for all.
}//down()
}
?>Le contenu du fichier
db/migrate/20100909133987_AddDeletedAtColumnToPostsTable.php pourrait être:
<?php
class AddDeletedAtColumnToPostsTable extends Phigrate_Migration_Base
{
public function up()
{
$this->addColumn("posts", "deleted_at", "datetime");
}//up()
public function down()
{
$this->removeColumn("posts", "deleted_at");
}//down()
}
?>Finalement, nous allons exécuter les migrations ci-dessus:
phigrate db:migrate
Started: 2010-09-03 9:26pm PDT
[db:migrate]:
Migrating UP to: 4 (current version: 0)
========= CreateUsersTable ======== (0.11)
========= CreatePostsTable ======== (0.00)
========= FixDanglingPhonesDataBug ======== (0.00)
========= AddDeletedAtColumnToPostsTable ======== (0.00)
Finished: 2010-09-03 9:26pm PDT
Pour chaque migration, il est également important d'implémenter la méthode
down() qui permet d'annuler ce qui a été fait dans la méthode up(). Bien
sûr, toutes les migrations ont une logique appropriée pour être exécutée lors du
passage dans la méthode down(), dans ce cas on devrait juste indiquer les
raisons.