对数据库管理操作之前,我们需要先建一个本地数据库。打开 Navicat 可视化数据库管理工具,在本机 localhost 下面新建一个 laravel 数据库,设置 字符集 utf8mb4 -- UTF-8 Unicode,排序规则选择 utf8mb4_general_ci。这样数据库就建好了。
建好数据库后,需要我们修改 laravel 项目的数据库配置项,我们可以看到项目根目录有一个 config 文件夹,在这里面是各种配置,打开后,我们可以看到 database.php 数据库配置文件,但是这个文件也只是读取的配置信息,那数据库的具体详细配置信息到底在哪里呢?
全文搜索 env() 的方法定义,可以找到 vendor/laravel/framework/src/Illuminate/Support/helpers.php 该文件。可知,通过getenv() 函数获取系统环境变量,找到实际当前加载 环境配置文件。
查阅官方说明,我们可以看到在项目根目录 有两个文件,.env 、.env.example ;打开 .env 就可以看到具体信息了,这样做有什么好处呢?
一、动态切换数据库(研发、测试、灰度、线上),修改配置即可;
二、我们会把 .env 问价放入到 项目根目录 .gitignore 文件中,这样在规避提交数据库敏感信息,不加到版本库中。并且方便运维部署。
现在,我们来看一下, migration 到底是什么东西?字面理解即迁移。。
打开项目根目录, database文件夹目录下 migrations文件夹里面,laravel已经默认给我们生成两个migration文件
. ├── 2014_10_12_000000_create_users_table.php ├── 2014_10_12_100000_create_password_resets_table.php
然后修改 .env的数据库配置信息:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=
创建表:
现在执行一下 php artisan migrate,使用 laravel的这个 migration 自动生成一下表:
php artisan migrate
执行上述语句之后,发现在命令行下会报错--特殊字段太长报错;查询相关信息之后,有如下解释:
laravel 5.4 改变了默认的数据库字符集,现在utf8mb4包括存储emojis支持。如果你运行MySQL v5.7.7或者更高版本,则不需要做任何事情。当你试着在一些MariaDB或者一些老版本的的MySQL上运行 migrations 命令时,就会碰到上述错误。然后贴出官方说明:https://laravel.com/docs/master/migrations#creating-indexes
如何解决呢?我们可以在 AppServiceProvider.php(app/Providers/AppServiceProvider.php) 文件里的 boot 方法里设置一个默认值:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); } /** * Register any application services. * * @return void */ public function register() { // } }
清空该数据库的表,然后再执行 php artisan migrate 该命令:
在laravel数据库即可看到,已经成创建users表、migrations表、password_resets表,即使用 migration 成功的对数据库进行了操作管理。
删除之前创建的表:
现在,如果我们的user表信息 name字段写错了,如何操作呢?
通过 php artisan 查看 帮助信息,我们可以看到 包含migrate 的更多操作命令:
回到上述场景,我们执行 php artisan migrate:rollback 命令,即可看到表 恢复到了之前 的状态,即删除了 users表、password_resets表
D:\software\wamp64\www\laravel5>php artisan migrate:rollback Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table
然后,修改 user表(2014_10_12_000000_create_users_table.php 该文件)的字段,name修改成 username。再次执行 php artisan migrate 命令。看到laravel数据库又重新生成了user表、password_resets表,并且 user表的name字段也修改成了username
D:\software\wamp64\www\laravel5>php artisan migrate Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table
创建一个新的 migration 文件,生成一个新的表:
使用 migrate 命令自动生成我们想要创建的表的 migration 文件,执行命令:php artisan make:migration create_articles_table --create=articles ,看到在 database\migrations 文件夹下,新增加了一个使用migration 创建的 生成articles表的语句文件。
D:\software\wamp64\www\laravel5>php artisan make:migration create_articles_table --create=articles Created Migration: 2018_07_08_144156_create_articles_table
修改 2018_07_08_144156_create_articles_table.php 该文件的 up方法,给表新增加几个字段。
public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } 修改成: public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamp('published_at'); $table->timestamps(); }); }
执行 php artisan migrate 命令,创建 articles表:
D:\software\wamp64\www\laravel5>php artisan migrate Migrating: 2018_07_08_144156_create_articles_table Migrated: 2018_07_08_144156_create_articles_table
修改表结构(添加表字段):
当表上线了之后,需要改表的结构怎么办?这时就不能再使用 rollback,因为已经有了数据,那就需要用到 php artisan make:migration add_intro_column_to_articles --table=articles 命令。可以看到 migration 该目录下 又多了一个文件 2018_07_08_150115_add_intro_column_to_articles.php。
D:\software\wamp64\www\laravel5>php artisan make:migration add_intro_column_to_articles --table=articles Created Migration: 2018_07_08_150115_add_intro_column_to_articles
修改该文件内容:
/** * Run the migrations. * * @return void */ public function up() { Schema::table('articles', function (Blueprint $table) { // $table->string('intro'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('articles', function (Blueprint $table) { // $table->dropColumn('intro'); }); }
然后在执行 php artisan migrate 命令。
D:\software\wamp64\www\laravel5>php artisan migrate Migrating: 2018_07_08_150115_add_intro_column_to_articles Migrated: 2018_07_08_150115_add_intro_column_to_articles
这样,intro字段就加入到了 articles 表中。
需要注意的是,如果需要使用 dropColumn() 方法的时候,需要我们引入一个另外包,我们可以通过composer来将这个包下到我们的项目当中。官方文档说明:https://docs.golaravel.com/docs/5.6/migrations/#renaming-and-dropping-tables
D:\software\wamp64\www\laravel5>composer require doctrine/dbal
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn