Thinkphp5.0モデルとデータベース2章:データの作成と移行
9936 ワード
この章では、データベースの作成と移行方法について説明し、ThinkPHP 5のデータベース移行拡張の使用について重点的に説明します.インストール拡張 データ移行 移行スクリプトの作成 移行 を実行ブレークポイント を設定する.ロールバック移行 移行方法 データテーブル を作成するデータテーブルまたはフィールドに があるかどうかを確認します.ストレージエンジン プライマリ・キー を設定する.データテーブルの名前変更と削除 使用可能フィールド フィールド修飾 特殊フィールド 修正フィールド フィールド を削除インデックス作成 インデックスを削除 外部キー制約 まとめ
データ移行は拡張パッケージであり、コア内蔵ではありません.まず、
データ移行は、データベースのバージョン管理と同様に、プロジェクトチームがアプリケーションのデータベース構造の一貫性を容易に変更し、維持できるようにします.手動でデータベースを変更することによる競合を回避するには、手動でデータベースを操作することをできるだけ避ける必要があります.
データ移行スクリプトを作成するのは良い習慣とチームワークの規範ですが、強制的ではなく、本書の裏面の章の学習にも影響しません.しばらく使えないと感じたら、先に省略してもいいです.
次のコマンドを使用して、移行スクリプトを作成します.
コマンドラインとコマンドに詳しくない場合は、クイックエントリーシリーズの第1部第10章のコマンドラインコマンドの説明を参照してください.
移行スクリプトには、次の操作しかありません. createTable(テーブルの作成) renameTable(テーブルの名前変更) addColumn(フィールドを追加) renameColumn(フィールド名の変更) addIndex(インデックスの追加) addForeignKey(外部キーの追加) では、
前回のデータ移行操作をロールバックできます(複数の移行ファイルが含まれる場合があります).
ブレークポイントが設定されている場合、デフォルトではブレークポイントにロールバックできるのは最大で、
移行スクリプトでは、ほとんどのデータベース操作をサポートする実装方法について説明します.
データテーブルを作成するには、
または
デフォルトはInnoDB
デフォルトではid自己増加プライマリ・キーが自動的に追加されます
デフォルトのプライマリ・キーは自己増加です.自己増加を必要としない場合は、次のようになります.
データベース構造コンストラクタには、データ・テーブルを構築するときに使用できるフィールド・タイプがたくさんあります.
コマンド#コマンド#
説明
BIGINT型状態に相当します.
BLOB型に相当します.
BOOLEAN型に相当します.
CHAR型に相当し、長さがあります.
DATE型に相当します.
DATETIME型に相当します.
DECIMAL型に相当し、精度と基数を持つ.
ENUM型に相当します.
FLOATモードに相当します.
INTEGER型に相当します.
JSON型に相当します.
JSONB型に相当します.
LONGTEXT型に相当します.
MEDIUMINT型に相当します.
MEDIUMTEXT型に相当します.
SMALLINT型に相当します.
VARCHAR型に相当します.
VARCHAR型に相当し、長さを有する.
TEXT型状態に相当する.
TIME型に相当します.
TINYINT型に相当します.
TIMESTAMPモードに相当します.
UUID型に相当します.
上記のフィールドタイプのリストに加えて、フィールドに追加できるフィールド「修飾」もあります.たとえば、フィールド「nullable」を使用するには、
次のリストは、フィールドの使用可能な修飾です.
に飾りを付ける
説明
このフィールドを他のフィールド「後」に配置します(MySQLのみ)
コメントを追加
このフィールドに「デフォルト」値を指定します.
このフィールドはNULL値の書き込みを許可します
データベース構造コンストラクタは、さまざまなタイプのインデックスをサポートします.まず、フィールドの値が一意であることを指定した例を見てみましょう.インデックスを作成するには、フィールド定義後にsetUniqueメソッドをチェーンで簡単に呼び出すことができます.
また、フィールドを定義した後にインデックスを作成することもできます.例:
フィールドの配列をインデックスメソッドに渡して、複合インデックスを作成することもできます.
今では、データ移行の拡張の使用について大体理解しています.理解していなければ、しばらく深く研究する必要はありません.本当に機会があれば、次の章では、クエリー・コンストラクタの使用を学びます.
下一篇:第一章:データベースアーキテクチャの基礎下一篇:第三章:クエリーコンストラクタ
拡張機能のインストール
データ移行は拡張パッケージであり、コア内蔵ではありません.まず、
composer
を通じて拡張をインストールする必要があります(composer
にまだ詳しくない方は、クラウドリファレンス公式のクイックエントリーチュートリアルの第1章の基礎部分のフレームワークcomposer
のインストール部分を参照してください):composer require topthink/think-migration=1.*
1.*
バージョンのインストールを指定したのは、最新の2.0
バージョンが5.1
バージョンのコアフレームワークにのみ適用されるためです.データ移行
データ移行は、データベースのバージョン管理と同様に、プロジェクトチームがアプリケーションのデータベース構造の一貫性を容易に変更し、維持できるようにします.手動でデータベースを変更することによる競合を回避するには、手動でデータベースを操作することをできるだけ避ける必要があります.
ThinkPHP5.0
のデータ移行拡張では、移行スクリプトの作成と移行の実行を優雅に行うことができます.データ移行スクリプトを作成するのは良い習慣とチームワークの規範ですが、強制的ではなく、本書の裏面の章の学習にも影響しません.しばらく使えないと感じたら、先に省略してもいいです.
移行スクリプトの作成
次のコマンドを使用して、移行スクリプトを作成します.
php think migrate:create CreateUserTable
コマンドラインとコマンドに詳しくない場合は、クイックエントリーシリーズの第1部第10章のコマンドラインコマンドの説明を参照してください.
CreateUserTable
このスクリプト名はアルパカ形式でなければなりません.コマンド入力が完了すると、プロジェクトルートディレクトリのdatabase/migrations
ディレクトリの下に移行スクリプトが作成され、デフォルトではchange
メソッドがあります.移行スクリプトには、次の操作しかありません.
change
の方法だけでいいです.ロールバックするときはchangeの操作に基づいて自動的に逆方向に操作することができます.そうしないと、up
とdown
の2つの方法を定義して、移行とロールバックの2つの具体的な操作を表す必要があります.up
、down
メソッドを定義してからchange
メソッドを定義しないでください.change
メソッドでデータテーブルを操作する場合、最後にcreate()
またはupdate()
のみを使用して操作を完了し、save()
は使用できません.移行の実行
php think migrate:run
//
php think migrate:run -t 20120103083322
ブレークポイントの設定
php think migrate:breakpoint
//
php think migrate:breakpoint -t 20120103083322
ロールバック移行
前回のデータ移行操作をロールバックできます(複数の移行ファイルが含まれる場合があります).
php think migrate:rollback
//
php think migrate:rollback -t 20120103083322
//
php think migrate:rollback -t 0
ブレークポイントが設定されている場合、デフォルトではブレークポイントにロールバックできるのは最大で、
--force
パラメータを使用してすべてのロールバックを強制できます.php think migrate:rollback -t 0 -f
移行方法
移行スクリプトでは、ほとんどのデータベース操作をサポートする実装方法について説明します.
データテーブルの作成
データテーブルを作成するには、
create
メソッドを使用し、前にaddColumn
メソッド関連メソッドを呼び出してデータフィールド定義を行います.public function change()
{
$this->table('user')
->addColumn(Column::string('name')->setComment(' '))
->addColumn(Column::string('username')->setUnique()->setComment(' '))
->addColumn(Column::string('email')->setUnique()->setComment(' '))
->addColumn(Column::string('password')->setComment(' '))
->create();
}
addColumn
メソッド追加フィールドは、Column
オブジェクトインスタンスに渡され、後で詳細に説明します.または
up
およびdown
を使用するpublic function up()
{
$this->table('user')
->addColumn(Column::string('name')->setComment(' '))
->addColumn(Column::string('username')->setUnique()->setComment(' '))
->addColumn(Column::string('email')->setUnique()->setComment(' '))
->addColumn(Column::string('password')->setComment(' '))
->create();
}
/**
* Down Method.
*/
public function down()
{
$this->dropTable('user');
}
データテーブルまたはフィールドが存在するかどうかを確認します。
if($this->hasTable('user')){
//
}
if($this->table('user')->hasColumn('username')){
//
}
ストレージエンジン
$this->table('user',['engine'=>'MyISAM'])
デフォルトはInnoDB
プライマリ・キーの設定
デフォルトではid自己増加プライマリ・キーが自動的に追加されます
$this->table('followers')
->setId(false) //
->setPrimaryKey(['user_id','follower_id']) //
->addColumn(Column::integer('user_id'))
->addColumn(Column::integer('follower_id'))
->create();
デフォルトのプライマリ・キーは自己増加です.自己増加を必要としない場合は、次のようになります.
$this->table('followers')
->setId('user_id')
->addColumn(Column::integer('follower_id'))
->create();
データテーブルの名前変更と削除
//
$this->table('user')->rename('user2');
//
$this->table('user')->drop();
//
$this->dropTable('user');
使用可能なフィールド
データベース構造コンストラクタには、データ・テーブルを構築するときに使用できるフィールド・タイプがたくさんあります.
コマンド#コマンド#
説明
Column::bigInteger('votes');
BIGINT型状態に相当します.
Column::binary('data');
BLOB型に相当します.
Column::boolean('confirmed');
BOOLEAN型に相当します.
Column::char('name', 4);
CHAR型に相当し、長さがあります.
Column::date('create_time');
DATE型に相当します.
Column::dateTime('create_time');
DATETIME型に相当します.
Column::decimal('amount', 5, 2);
DECIMAL型に相当し、精度と基数を持つ.
Column::enum('choices', ['foo', 'bar']);
ENUM型に相当します.
Column::float('amount');
FLOATモードに相当します.
Column::integer('votes');
INTEGER型に相当します.
Column::json('options');
JSON型に相当します.
Column::jsonb('options');
JSONB型に相当します.
Column::longText('description');
LONGTEXT型に相当します.
Column::mediumInteger('numbers');
MEDIUMINT型に相当します.
Column::mediumText('description');
MEDIUMTEXT型に相当します.
Column::smallInteger('votes');
SMALLINT型に相当します.
Column::string('email');
VARCHAR型に相当します.
Column::string('name', 100);
VARCHAR型に相当し、長さを有する.
Column::text('description');
TEXT型状態に相当する.
Column::time('sunrise');
TIME型に相当します.
Column::tinyInteger('numbers');
TINYINT型に相当します.
Column::timestamp('added_on');
TIMESTAMPモードに相当します.
Column::uuid('id');
UUID型に相当します.
フィールド修飾
上記のフィールドタイプのリストに加えて、フィールドに追加できるフィールド「修飾」もあります.たとえば、フィールド「nullable」を使用するには、
setNullable
メソッドを使用します. $this->table('user')
->addColumn(Column::string('name')->setNullable())
->create();
次のリストは、フィールドの使用可能な修飾です.
に飾りを付ける
説明
->setAfter('column')
このフィールドを他のフィールド「後」に配置します(MySQLのみ)
->setComment('my comment')
コメントを追加
->setDefault($value)
このフィールドに「デフォルト」値を指定します.
->setNullable()
このフィールドはNULL値の書き込みを許可します
->setUnsigned()
integer
フィールドをUNSIGNED
に設定特殊フィールド
$this->table('user')
->addTimestamps() // create_time update_time
->addSoftDelete() // delete_time
->addMorphs('taggable') // taggable_id taggable_type
->create();
フィールドの変更
//
$this->table('user')->renameColumn('old_name','new_name');
//
$this->table('user')->changeColumn(Column::integer('votes')->setNullable());
フィールドの削除
$this->table('user')->removeColumn('name');
索引の作成
データベース構造コンストラクタは、さまざまなタイプのインデックスをサポートします.まず、フィールドの値が一意であることを指定した例を見てみましょう.インデックスを作成するには、フィールド定義後にsetUniqueメソッドをチェーンで簡単に呼び出すことができます.
$this->table('user')
->addColumn(Column::string('name')->setUnique()->setNullable())
->create();
また、フィールドを定義した後にインデックスを作成することもできます.例:
$this->table('user')
->addColumn(Column::string('name')->setNullable())
->addIndex('name',['unique'=>true])
->create();
フィールドの配列をインデックスメソッドに渡して、複合インデックスを作成することもできます.
addIndex(['name','email'])
索引の削除
$this->table('user')->removeIndex('name');
$this->table('user')->removeIndex(['name','email']);
外部キーコンストレイント
$table = $this->table('tags');
$table->addColumn(Column::integer('tag_name'))
->save();
$this->table('tag_relationships')
->addColumn(Column::integer('tag_id'))
->addForeignKey('tag_id', 'tags', 'id', array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION'))
->save();
まとめ
今では、データ移行の拡張の使用について大体理解しています.理解していなければ、しばらく深く研究する必要はありません.本当に機会があれば、次の章では、クエリー・コンストラクタの使用を学びます.
下一篇:第一章:データベースアーキテクチャの基礎下一篇:第三章:クエリーコンストラクタ