zoukankan      html  css  js  c++  java
  • Laravel学习笔记(五)数据库 数据库迁移案例2——创建数据结构,数据表,修改数据结构

    默认假设

    所有的列在定义的时候都有默认的假设,你可以根据需要重写。

    • Laravel假定每个表都有一个数值型的主键(通常命名为”id”),确保新加入的每一行都是唯一的。Laravel只有在每个表都有数值型主键时才会正常运行。所以,对于每一个Laravel应用,都要确保定义的主键使用的是increments()方法。
    • 列在默认情况下为NOT NULL。

    现在,让我们一行行分析结构生成器生成的authors表,下面是up()方法中的代码:

     1 // auto increment id (primary key)
     2 $table->increments('id');
     3 
     4 $table->string('name');
     5 $table->integer('age')->nullable();
     6 $table->boolean('active')->default(1);
     7 $table->integer('role_id')->unsigned();
     8 $table->text('bio');
     9 
    10 // created_at, updated_at DATETIME
    11 $table->timestamps();

    实际上生成的SQL代码为:

    1 `id` INT(11) NOT NULL AUTO_INCREMENT,
    2 `name` VARCHAR(255) NOT NULL,
    3 `age` INT(11) NULL DEFAULT NULL,
    4 `active` TINYINT(4) NOT NULL DEFAULT '1',
    5 `role_id` INT(10) UNSIGNED NOT NULL,
    6 `bio` TEXT NOT NULL,
    7 
    8 `created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
    9 `updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

    我们会意识到,迁移是多么的强大,我们自需要记住一些结构生成器方法而不是写晦涩难懂的SQL DDL代码。

    我们创建了表,那我们想要回滚的时候怎么办呢?只需要在于up()方法对应的down()方法中使用drop()方法即可。

    1 public function down()
    2 {
    3         Schema::drop('authors');
    4 }

    这个方法非常简单,只有一行。它的全部作用就是删除”authors”表,如果你熟悉sql,它等同于DROP TABLE authors。

    现在,我们已经写好了架构,我们就可以对数据库执行迁移文件了。转到命令行工具,跳转到应用目录下,运行artisan migrate命令:

    1 php artisan migrate

    执行结果如下:

    检查数据库,你会发现已经有了”authors”表,

     

    表结构如下:

     

    如果你要使用sql语句实现这张表,那么sql查询语句如下:

     1 CREATE TABLE `authors` (
     2         id          int AUTO_INCREMENT NOT NULL,
     3         name        varchar(255) NOT NULL,
     4         age         int,
     5         active      tinyint NOT NULL DEFAULT '1',
     6         role_id     int(10) UNSIGNED NOT NULL,
     7         bio         text NOT NULL,
     8         created_at  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
     9         updated_at  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
    10         email       varchar(64) NOT NULL,
    11         /* Keys */
    12         PRIMARY KEY (id)
    13 ) ENGINE = InnoDB;

    现在假设我们上次的执行存在错误想要回滚,我们自需要使用artisan命令行工具执行下面的命令即可:下一次,如果你想修改数据模型,你可以创建一个新的迁移,再次执行命令artisan migrate。每一次执行artisan migrate命令,它都会根据时间戳去检查哪些没有执行,如果执行了,就跳到下一个文件,如果没有执行,就执行这次迁移,直到执行完所有迁移文件。

    1 php artisan migrate:rollback

    运行如下:

    你会发现,表”authors”已经从数据库中删除了。

    现在重新创建”authors”表,执行artisan migrate命令:

    1 php artisan migrate

    这时,表”authors”又重新创建了。

    但是我想在表中添加”email”列。先使用artisan创建新的迁移文件:

    php artisan migrate:make add_email_to_authors_table

    运行结果如下:

    然后编辑2014_03_12_051119_add_email_to_authors_table.php文件,添加电子邮件列。我们使用Schema::table()方法,有两个参数:表名、闭包函数(在此函数内添加字段)。

    1 public function up()
    2 {
    3         Schema::table('authors', function($table) {
    4                 $table ->string('email', 64);
    5         });
    6 }

    有了添加方法,当然也需要添加回滚方法了,这里再次使用Schema::table()方法。

    1 public function down()
    2 {
    3         Schema::table('authors', function($table) {
    4                 $table ->dropColumn('email');
    5         });
    6 }

    上面的方法使用了dropColumn()方法上出列。

    现在运行artisan命令运行该迁移文件如下:

     

    刷新数据库表,你会发现”email”字段已经在”authors”中出现了,如下图:

     

    如果我们回滚了这次迁移,那么email字段会从表中删除。

    Artisan命令还有一个更强大的命令行,它可以回滚所有的迁移:

    1 php artisan migrate:reset

    表操作

    Laravel 方法

    目的

    create()

    用一个名称创建的表。第二个参数是包含表定义的闭包。

    drop()

    可以通过drop()方法删除表。删除一个表同时会删除它的所有列和任何索引。

    dropIfExists()

    删除表 (如果存在)。

    rename($to)

    重命名表。

    列操作

    Laravel 方法

    目的

    dropColumn($columns)

    删除指定的列。请记住任何与该列关联的索引也将被删除。

    dropColumns()

    删除指定的列。

    索引的操作

    Laravel 方法

    目的

    primary($columns, $name = null)

    指定表的主键。

    unique($columns, $name = null)

    指定表的唯一索引。

    index($columns, $name = null)

    指定表的索引。

    foreign($columns, $name = null)

    指定表的外键。

    dropPrimary($index = null)

    删除给定的主键。

    dropUnique($index)

    删除给定的唯一键。

    dropIndex($index)

    删除给定的索引。

    dropForeign($index)

    删除给定的外键。

    参考资料:http://laravelbook.com/laravel-migrations-managing-databases

    未完待续待续……

  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/huangbx/p/Laravel_5.html
Copyright © 2011-2022 走看看