Laravel5.8
  1. 安装配置及核心内容
  2. 框架基础
  3. 进阶知识
  4. 数据库相关
    1. Laravel - 数据库相关 - 简介与配置
    2. Laravel - 数据库相关 - 原生 SQL 操作
    3. Laravel - 数据库相关 - 查询构造器
    4. Laravel - 数据库相关 - 分页
    5. Laravel - 数据库相关 - 数据迁移
    6. Laravel - 数据库相关 - 数据填充
    7. Laravel - 数据库相关 - redis
    8. Laravel - Eloquent 模型 - 入门
    9. Laravel - Eloquent 模型 - 查询作用域(全局,本地,动态)
    10. Laravel - Eloquent 模型 - 事件与监听方法
    11. Laravel - Eloquent 模型 - 关联关系
    12. Laravel - Eloquent 模型 - 关联查询
    13. Laravel - Eloquent 模型 - 访问器和修改器

Laravel - 数据库相关 - 数据迁移

程序员日记      2019-09-05

生成迁移类

php artisan make:migration create_users_table

说明

1.新的迁移位于 database/migrations 目录

2.每个迁移文件名都包含时间戳从而允许 Laravel 判断其顺序


生成迁移类的选项

php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users

说明

--table --create 选项可以用于指定表名以及该迁移是否要创建一个新的数据表

--path 选项可以自定义迁移的输出路径


迁移类的结构

迁移类包含了两个方法:up down

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

说明

迁移类包含了两个方法 up down

up 方法用于新增表,列或者索引到数据库,

down 方法就是 up 方法的逆操作,和 up 里的操作相反。


运行迁移

php artisan migrate

强制运行迁移

php artisan migrate --force

回滚迁移

想要回滚最新的一次迁移”操作“,可以使用 rollback 命令

php artisan migrate:rollback


回滚指定数目的迁移

php artisan migrate:rollback --step=5

说明

回滚最后5条迁移


回滚所有的应用迁移

php artisan migrate:reset


回滚并迁移数据库

php artisan migrate:refresh

说明

migrate:refresh 命令将会先回滚所有数据库迁移,然后运行 migrate 命令。


回滚并迁移数据库,然后填充数据

php artisan migrate:refresh --seed


删除所有表并迁移数据库

php artisan migrate:fresh

说明

migrate:fresh 命令将会先从数据库中删除所有表然后执行 migrate 命令


删除所有表并迁移数据库,然后填充数据

php artisan migrate:fresh --seed

数据表方法

创建表

Schema::create('users', function ($table) {
    $table->increments('id');
});


检查表/列是否存在

if (Schema::hasTable('users')) {
    //
}
if (Schema::hasColumn('users', 'email')) {
    //
}


数据库连接与表选项

如果你想要在一个数据库连接上执行表结构操作,而该数据库连接并不是默认数据库连接,可以使用 connection 方法

Schema::connection('foo')->create('users', function (Blueprint $table) {
    $table->increments('id');
});


指定表的存储引擎(MySQL)

$table->engine = 'InnoDB';	


指定数据表的默认字符集(MySQL)

$table->charset = 'utf8';	


指定数据表的默认字符(MySQL)

$table->collation = 'utf8_unicode_ci';	


创建临时表(除SQL Server)

$table->temporary();	


重命名表

Schema::rename($from, $to);


删除表

Schema::drop('users');
Schema::dropIfExists('users');

数据列方法

示例

Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});

说明

$table->string('email');创建email数据列


可用数据列类型

自增 UNSIGNED BIGINT(主键)列

$table->bigIncrements('id');


BIGINT 类型列

$table->bigInteger('votes');	 


BLOB 类型列

$table->binary('data');	


OOLEAN 类型列

$table->boolean('confirmed');	


CHAR 类型列

$table->char('name', 4);	


DATE 类型列

$table->date('created_at'); 


DATETIME 类型列

$table->dateTime('created_at');	


DATETIME 类型(带时区)列

$table->dateTimeTz('created_at');	


DECIMAL 类型列,带精度和范围

$table->decimal('amount', 5, 2);	


DOUBLE 类型列,带精度, 总共15位数字,小数点后8位 

$table->double('column', 15, 8);	


ENUM 类型列

$table->enum('level', ['easy', 'hard']);	


FLOAT 类型列,带精度和总位数

$table->float('amount', 8, 2);	


GEOMETRY 类型列

$table->geometry('positions');	


GEOMETRYCOLLECTION 类型列

$table->geometryCollection('positions');


自增 UNSIGNED INTEGER (主键)类型列

$table->increments('id');	


INTEGER 类型列

$table->integer('votes');	


IP 地址类型列

$table->ipAddress('visitor');	


JSON 类型列

$table->json('options');	


JSONB 类型列

$table->jsonb('options');	 


LINESTRING 类型列

$table->lineString('positions');	


LONGTEXT 类型列

$table->longText('description');	


MAC 地址类型列

$table->macAddress('device');	


自增 UNSIGNED MEDIUMINT 类型列(主键)

$table->mediumIncrements('id');	


MEDIUMINT 类型列

$table->mediumInteger('numbers');	


MEDIUMTEXT 类型列

$table->mediumText('description');	


添加一个 UNSIGNED INTEGER 类型的 taggable_id 列和一个 VARCHAR 类型的 taggable_type 列

$table->morphs('taggable');	


MULTILINESTRING 类型列

$table->multiLineString('positions');	


MULTIPOINT 类型列

$table->multiPoint('positions');	


MULTIPOLYGON 类型列

$table->multiPolygon('positions');	


morphs() 列的 nullable 版本

$table->nullableMorphs('taggable');	


timestamps() 的别名

$table->nullableTimestamps();	


POINT 类型列

$table->point('position');	


POLYGON 类型列

$table->polygon('positions');	


添加一个允许为空的 remember_token VARCHAR(100) 列

$table->rememberToken();	


自增 UNSIGNED SMALLINT (主键)类型列

$table->smallIncrements('id');	


SMALLINT 类型列

$table->smallInteger('votes');	


新增一个允许为空的 deleted_at TIMESTAMP 列用于软删除

$table->softDeletes();	


新增一个允许为空的 deleted_at TIMESTAMP (带时区)列用于软删除

$table->softDeletesTz();	


VARCHAR 类型列,带一个可选长度参数

$table->string('name', 100);


TEXT 类型列

$table->text('description');	


TIME 类型列

$table->time('sunrise');	


TIME 类型(带时区)

$table->timeTz('sunrise');	


TIMESTAMP 类型列

$table->timestamp('added_on');	


TIMESTAMP 类型(带时区)列

$table->timestampTz('added_on');	


添加允许为空的 created_at 和 updated_at TIMESTAMP 类型列

$table->timestamps();	


添加允许为空的 created_at 和 updated_at TIMESTAMP 类型列(带时区)

$table->timestampsTz();	


自增的 UNSIGNED TINYINT 类型列(主键)

$table->tinyIncrements('numbers');	


TINYINT 类型列

$table->tinyInteger('numbers');	


无符号的 BIGINT 类型列

$table->unsignedBigInteger('votes');	


UNSIGNED DECIMAL 类型列,带有总位数和精度

$table->unsignedDecimal('amount', 8, 2);	


无符号的 INTEGER 类型列

$table->unsignedInteger('votes');	


无符号的 MEDIUMINT 类型列

$table->unsignedMediumInteger('votes');	


无符号的 SMALLINT 类型列

$table->unsignedSmallInteger('votes');	


无符号的 TINYINT 类型列

$table->unsignedTinyInteger('votes');	


UUID 类型列

$table->uuid('id');	


YEAR 类型列

$table->year('birth_year');	

列修改器

示例

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

说明

nullable 允许列值为null


列修改器列表

将该列置于另一个列之后 (MySQL)

->after('column')	


设置 INTEGER 列为自增主键

->autoIncrement()	


指定数据列字符集(MySQL)

->charset('utf8')	


指定数据列字符序(MySQL/SQL Server)

->collation('utf8_unicode_ci')	


添加注释信息

->comment('my comment')	


指定列的默认值

->default($value)	


将该列置为表中第一个列 (MySQL)

->first()	


允许该列的值为 NULL

->nullable($value = true)	


创建一个存储生成列(MySQL)

->storedAs($expression)	


设置 INTEGER 列为 UNSIGNED(MySQL)

->unsigned()	


设置 TIMESTAMP 列使用 CURRENT_TIMESTAMP 作为默认值

->useCurrent()	


创建一个虚拟生成列(MySQL)

->virtualAs($expression)	


通过指定的序列选项创建一个标识列(PostgreSQL)

->generatedAs($expression)	


定义序列值优先于标识列的输入(PostgreSQL)

->always()	

修改数据列

先决条件

doctrine/dbal 依赖添加到 composer.json 文件


更新列属性

change 方法允许你修改已存在的列为新的类型,或者修改列的属性。

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

说明

把name字段长度改成50


更新列允许为空

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});

说明

只有以下数据列类型能修改:

bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger 和 unsignedSmallInteger。


重命名列

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

说明

暂不支持 enum 类型的列的修改和重命名。


删除数据列

要删除一个列

$table->dropColumn('votes');

删除多个列

$table->dropColumn(['votes', 'avatar', 'location']);

删除 remember_token 列

$table->dropRememberToken();	

删除 deleted_at 列

$table->dropSoftDeletes();	

dropSoftDeletes() 方法别名

$table->dropSoftDeletesTz();	

删除 created_at 和 updated_at 列

$table->dropTimestamps();	

dropTimestamps() 方法别名

$table->dropTimestampsTz();	

索引

添加索引

添加主键索引

$table->primary('id');	

添加组合索引

$table->primary(['id', 'parent_id']);	

添加唯一索引

$table->unique('email');	

添加普通索引

$table->index('state');	

添加空间索引(不支持SQLite)

$table->spatialIndex('location');	


索引长度

AppServiceProvider 中调用 Schema::defaultStringLength 方法设置索引长度

public function boot()
{
    Schema::defaultStringLength(191);
}


重命名索引

$table->renameIndex('from', 'to')


删除索引

从 “users” 表中删除主键索引

$table->dropPrimary('users_id_primary');	

从 “users” 表中删除唯一索引

$table->dropUnique('users_email_unique');	

从 “geo” 表中删除普通索引

$table->dropIndex('geo_state_index');	

从 “geo” 表中删除空间索引(不支持SQLite)

$table->dropSpatialIndex('geo_location_spatialindex');	

从geo表中删除index索引state

Schema::table('geo', function (Blueprint $table) {
    $table->dropIndex(['state']); 
});

说明

删除索引的格式为

连接表名,外键名加上索引类型


外键约束

Schema::table('posts', function (Blueprint $table) {
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
});

说明

在posts 表中定义了一个引用 users 表 id 列的 user_id 列