zoukankan      html  css  js  c++  java
  • Laravel学习笔记(四)数据库 数据库迁移案例

    创建迁移

    首先,让我们创建一个MySql数据库“Laravel_db”。接下来打开app/config目录下的database.php文件。请确保default键值是mysql:

    1 return array(
    2         ...
    3         'default' => 'mysql',

    然后输入你的数据库配置信息:

     1 ...
     2 'connections' => array(
     3         'mysql' => array(
     4                 'driver'    => 'mysql',
     5                 'host'      => '127.0.0.1',
     6                 'database'  => 'laravel_db', //数据库名
     7                 'username'  => 'root, //你的数据库用户
     8                 'password'  => 'Your_Database_Password', //数据库登录密码
     9                 'charset'   => 'utf8',
    10                 'collation' => 'utf8_unicode_ci',
    11                 'prefix'    => '',
    12         ),
    13 ...

    我们要使用Laravel命令行工具artisan来创建我们新的迁移。要运行astisan需要打开一个终端,切换路径到Laravel引用程序文件夹的更目录。

    第一个我们需要做的就是安装migrations表,这样Laravel就可以追踪哪些迁移已经运行了。下面的命令将会在数据库中创建一个特殊的表:

    1 php artisan migrate:install

    如下:

     

    如果创建成功,artisan会返回“Migration table created successfully.”。

    查看数据库,你会发现artisan确实创建了一个新表“migrations”。

    你不需要过于关注这个表。这只是一个帮助Laravel监视迁移的表。当你添加新的迁移,artisan migrate会检查migrations表并执行那些没有运行的迁移。

    现在,让我们创建一个实际的迁移文件。我想创建一个名为“author”的新表。让我们运行artisan migrate:make命令:

    1 php artisan migrate:make create_authors_table

    运行截图如下:

     

    你会在app/database/migrations目录下看到文件2014_03_11_162133_create_authors_table.php。

    正如你看到的,一个新的迁移文件名称中包含时间戳和迁移的描述性名称。

    [注]注意细节的读者可能会注意到我们用“authors”问不是“author”命名作者表。这是Laravel设计理念的一方面,使用自然模型帮助我们存储数据模型。Laravel的表应该始终命名为你的数据模型的复数形式。对于Author模型,表就被命名为“authors”。如果你有一个模型Car,你需要命名表为“Cars”。另外,SELECT name FROM authors WHERE id=100SELECT name FROM author WHERE id=100更有意义。

    迁移的解剖

    迁移是IlluminateDatabaseMigrationsMigrationLaravel 类的子类。您创建的类必须至少包含类的两个方法up()和down()。下面是生成由artisan的骨架迁移类:

     1 <?php
     2 use IlluminateDatabaseSchemaBlueprint;
     3 use IlluminateDatabaseMigrationsMigration;
     4 
     5 class CreateAuthorsTable extends Migration {
     6 
     7     /**
     8      * Run the migrations.
     9      *
    10      * @return void
    11      */
    12     public function up()
    13     {
    14         //
    15     }
    16 
    17     /**
    18      * Reverse the migrations.
    19      *
    20      * @return void
    21      */
    22     public function down()
    23     {
    24         //
    25     }
    26 }

    使用Laravel,我们可以在任何时间迁移到数据模型的特定版本。Up()方法中的代码执行向前迁移,down()执行反向迁移(创建数据库的新版本或者回滚到前一个版本)。

    很容易想到up()执行迁移文件操作,down()是完全相反。就像word文档中的撤销命令——撤销所做的修改。例如,我们想创建一个“authors”表,在up()中创建,在down()中撤销。让我们看看应该怎么做。

    Artisan migrate:make命令有一些可以加快你工作流的其他选项。让我们运行下面命令:

    1 php artisan migrate:make create_authors_table --table authors --create

    在上面的例子中,我们使用—table选项指定表名。另外,我添加了—create选项去告知artisan这个表需要被创建。如果我们打开迁移文件,你会发现artisan为我们生成了额外的样板文件代码:

     1 <?php
     2 use IlluminateDatabaseSchemaBlueprint;
     3 use IlluminateDatabaseMigrationsMigration;
     4 
     5 class CreateAuthorsTable extends Migration {
     6 
     7     /**
     8      * Run the migrations.
     9      *
    10      * @return void
    11      */
    12     public function up()
    13     {
    14         Schema::table('authors', function(Blueprint $table)
    15         {
    16             //
    17         });
    18     }
    19 
    20     /**
    21      * Reverse the migrations.
    22      *
    23      * @return void
    24      */
    25     public function down()
    26     {
    27         Schema::table('authors', function(Blueprint $table)
    28         {
    29             //
    30         });
    31     }
    32 }

    非常棒!现在,让我们做更加具体的工作。我们要使用的 Laravel Schema类来创建我们的"Authors"表。下面是创建作者表,并将必要的列添加到表的迁移代码:

     1 public function up()
     2 {
     3      Schema::create('authors', function(Blueprint $table)
     4     {
     5             // auto increment id (primary key)
     6             $table->increments('id');
     7 
     8             $table->string('name');
     9             $table->integer('age')->nullable();
    10             $table->boolean('active')->default(1);
    11             $table->integer('role_id')->unsigned();
    12             $table->text('bio');
    13 
    14             // created_at, updated_at DATETIME
    15             $table->timestamps();
    16       });
    17 }

    我们调用Schema::create()方法创建一个新表“authors”。Schema::create()方法有两个参数:表名和一个闭包,闭包中包含了列定义。

    闭包中,我们可以使用$table参数创建列。列定义方法的基本结构是:

    1 $table->column_type(column_name)

    列类型

    在前面的示例中,我们指定的名称列的类型为"string"。但这是什么意思?数据库中通常没有”string”类型的列。

    请记住,Laravel 试图使您的应用程序独立于底层的数据库;例如,如果你想,你可以使用 MySql 开发并部署到 Postgresql。如果您在迁移中使用 MySql 的列类型,应用到 Postgres 数据库可能无法工作。所以,Laravel 迁移通过使用通用的数据类型使你与底层的数据库类型系统隔离。如果我们要迁移 MySql 数据库, string()方法将创建VARCHAR(255)类型的列。在 Postgres,同一迁移可能会添加CHAR VARYING(255)类型的列 (虽然VARCHAR类型支持所有主要的数据库平台)。

    Laravel 直接支持以下数据类型:

    Laravel 方法

    列的类型

    increments($column)

    向表中添加自动递增的主键

    string($column)

    添加一个VARCHAR(255)列

    string($column, $length)

    添加具有长度的VARCHAR

    integer($column)

    向表中添加一个INTEGER列,

    float($column)

    向表中添加一个FLOAT的列

    decimal($column, $precision, $scale)

    添加一个DECIMAL列的精度和小数位数。精度是总数中数字的位数。规模是小数点的右侧的位数。例如,数 123.45 具有精度为 5 和 2 的小数。从逻辑上讲,规模不能大于精度。

    boolean($column)

    向表中添加一个BOOLEAN的列。注意: 存储布尔值的方式而有所不同从一个数据库到另一个数据库。一些使用"1"和"0"的整数值来表示 true 和 false,个别的,其他人使用"T"和"F"等字符。Laravel 的"boolean"类型映射到数据库的所有系统上的small integer列。Laravel 很好的处理 PHP 的true与false之间的映射,所以你不需要担心。

    text($column)

    相当于表的TEXT

    blob($column)

    相当于表的BLOB

    binary($column)

    相当于表的BINARY

    dateTime($column)

    相当于表DATETIME

    timestamp($column)

    相当于表TIMESTAMP

    date($column)

    相当于表的DATE

    time($column)

    相当于表的TIME

    enum($column, array $allowed)

    在表上创建一个新的ENUM列

    此外,还有几个你需要知道的扩展方法:

    Laravel 方法

    列的类型

    timestamps()

    timestamps()与timestamp()不同。它是一个 Laravel 用来管理创建和修改作为created_at和updated_at TIMESTAMP列的便利方法。他们是 Laravel 可以自己修改的两个特殊的数据库列。created_at列为仅当行被创建时当前时间戳。另一方面, updated_at被修改为每次操作的行的数据时当前时间戳。

    nullable()

    将指定列允许NULL值。默认情况下,Laravel 使在数据库级别需要通过添加NOT NULL约束的列。

    default($value)

    设置要用于新行作为初始值的列的默认值。你永远不需要显式设置的默认值为 null。不设置它默认值就为null。

    unsigned()

    设置INTEGER列为UNSIGNED。

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

    未完待续……

  • 相关阅读:
    两个链表的第一个公共节点(Python and C++解法)
    第一个只出现一次的字符(Python and C++解法)
    丑数(Python and C++解法)
    最长不含重复字符的子字符串(Python and C++解法)
    礼物的最大值(Python and C++解法)
    把数字翻译成字符串(Python and C++解法)
    连续子数组的最大和(Python and C++解法)
    最小的k个数(Python and C++解法)
    数组中出现次数超过一半的数字(Python and C++解法)
    字符串的排列(Python and C++解法)
  • 原文地址:https://www.cnblogs.com/huangbx/p/Laravel_4.html
Copyright © 2011-2022 走看看