Thinkphp5.0モデルとデータベース2章:データの作成と移行

9936 ワード

この章では、データベースの作成と移行方法について説明し、ThinkPHP 5のデータベース移行拡張の使用について重点的に説明します.
  • インストール拡張
  • データ移行
  • 移行スクリプトの作成
  • 移行
  • を実行
  • ブレークポイント
  • を設定する.
  • ロールバック移行
  • 移行方法
  • データテーブル
  • を作成する
  • データテーブルまたはフィールドに
  • があるかどうかを確認します.
  • ストレージエンジン
  • プライマリ・キー
  • を設定する.
  • データテーブルの名前変更と削除
  • 使用可能フィールド
  • フィールド修飾
  • 特殊フィールド
  • 修正フィールド
  • フィールド
  • を削除
  • インデックス作成
  • インデックスを削除
  • 外部キー制約
  • まとめ
  • 拡張機能のインストール


    データ移行は拡張パッケージであり、コア内蔵ではありません.まず、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メソッドがあります.
    移行スクリプトには、次の操作しかありません.
  • createTable(テーブルの作成)
  • renameTable(テーブルの名前変更)
  • addColumn(フィールドを追加)
  • renameColumn(フィールド名の変更)
  • addIndex(インデックスの追加)
  • addForeignKey(外部キーの追加)
  • では、changeの方法だけでいいです.ロールバックするときはchangeの操作に基づいて自動的に逆方向に操作することができます.そうしないと、updownの2つの方法を定義して、移行とロールバックの2つの具体的な操作を表す必要があります.updownメソッドを定義してから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();
    
    

    まとめ


    今では、データ移行の拡張の使用について大体理解しています.理解していなければ、しばらく深く研究する必要はありません.本当に機会があれば、次の章では、クエリー・コンストラクタの使用を学びます.
    下一篇:第一章:データベースアーキテクチャの基礎下一篇:第三章:クエリーコンストラクタ