补充上节课:配置虚拟主机
不用修改nginx的配置文件,减小学习成本,只要在homestead.yaml
和host
文件两个文件中作很小的改动就行php
D:\03www2018\homestead\Homestead.yaml
map: myblog.app to: /home/vagrant/abcde/study/myblog/public
C:\Windows\System32\drivers\etc\hosts
192.168.10.10 www.myblog.app
D:\03www2018\study\myblog\config\app.php
'timezone' => 'Asia/Shanghai',
D:03www2018studymyblog.env.homehtml
DB_PREFIX=study_
D:\03www2018\study\myblog\config\database.php
'migrations' => 'migrations2017', 'prefix' => env('DB_PREFIX', ''),
在navicat for mysql中新建链接,用户名homestead
,密码secret
,新建数据库myblog,字符集为utf8mb4 -- UTF-8 Unicode
,规则排序为utf8mb4_general_ci
GRANT ALL PRIVILEGES ON myblog.* TO daqi@localhost IDENTIFIED BY 'daqi168' WITH GRANT OPTION;
有5个地方能够指定开发环境[咱们这里使用第1种方法或第2种方法]mysql
- 在homestead.yaml中
- 在入口文件的最开始加上
putenv("APP_ENV=home");
- 修改web服务器的配置文件,如nginx配置文件中加上 env APP_ENV=home;
apache配置文件中加上SetEnv APP_ENV home- 在.htaccess中加上
- php主配置文件php-fpm.conf来设置
修改homestead.yaml
加下nginx
variables: - key: 'APP_ENV' value: 'home' - key: 'APP_DEBUG' value: 'true'
先生成应用的keylaravel
vagrant@homestead:~/abcde/study/myblog$ php artisan key:generate
Application key [base64:s6Rhb/LhTYIpjXi3x+tN9Yon/iBavjnxO4bjXmrYq1g=] set successfully.
将生成的key放在配置文件.env.home中APP_KEY
有关base64的详细了解参考: 阮一峰的base64笔记
每一个laravel必须得生成一个key,它是在加密模块中必需要用到的,
APP_NAME=个人博客 APP_ENV=local APP_KEY= base64:s6Rhb/LhTYIpjXi3x+tN9Yon/iBavjnxO4bjXmrYq1g= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=myblog DB_USERNAME=daqi DB_PASSWORD=daqi168 DB_PREFIX=study_ //本身加
D:\03www2018\study\myblog\config\database.php
中改web
'prefix' => env('DB_PREFIX', ''), 'migrations' => 'migrations2017',
vagrant@homestead:~/abcde/study/myblog$ composer require advance100/helper
官方文档参考
先了解一下有关migrate的全部命令sql
make:migration 新建一个迁移文件
migrate 运行数据库迁移,这个是安装软件时执行的
migrate:fresh 会删除全部已经生成的表,并从新运行全部的迁移
migrate:install 新建一个迁移仓库,会在homestead数据库中生成一个表migrations
migrate:refresh Reset and re-run all migrations
migrate:reset Rollback all database migrations
migrate:rollback 只回滚最后一条迁移
migrate:status 显示每条迁移的状态
make:migration
参考: \Illuminate\Database\Console\Migrations\MigrateMakeCommand
shell
问题来了?若是我想放在其它路径,如vendor下面的某个模块下面如作操做?
答:这要用到 php artisan vendor:publish
数据库
以新建一个用户权限管理为例,建如下几个表apache
生成建表admins的迁移文件
vagrant@homestead:~/abcde/study/myblog$ php artisan make:migration create_admins_table Created Migration: 2017_10_31_231348_create_admins_table
注意make:migration有1个必写的参数name, 3个可选的选项 --create,--tabel,--path
create_表名_table
,这种写法,选项--create
能够省略,不然不能省,如make:migration wang --create=members
--
,新手易写掉一个--create=表名
,新建一个表,表名通常全为小写字母,复数形式--table=表名
,修改现成的表--create
与--table
是2选1vendor/包/模块
中生成迁移文件,得手工编写,或自动生成后拷贝到指定地方,但要注意的是模块中的服务提供商中得写publish
方法yyyy_mm_dd_His_名字.php
,文件中类名是将name写在大驼峰的格式,如name为create_admins_table
变成class CreateAdminsTable extends Migration
asort(名字名组成的数组,SORT_REGULAR );
以升序的方式排列的,因此更名时要注意按上面生成另外几个迁移文件
php artisan make:migration create_roles_table php artisan make:migration create_permissions_table php artisan make:migration create_role_user_table php artisan make:migration create_permission_role_table
up是migrate时执行的方法
down是migrate:rollback
,migrate:reset
,migrate:fresh
,migrate:refresh
时会执行的方法
Facade(有人翻译成门面,我以为翻译成表面比较合适些) Schema::方法其实是执行\Illuminate\Database\Schema\MySqlBuilder
的方法,分下面几种判断的有hasTable
,hasColumn
,hasColumns
读取的有getAllTables
,getColumnListing
,getColumnType
,getConnection
设置的有setConnection
,blueprintResolver
删除的有dropAllTables
操做的有rename
,enableForeignKeyConstraints
,disableForeignKeyConstraints
迁移经常使用有 Schema::create,Schema::table,Schema::drop,Schema::dropIfExists
Blueprint(翻译成蓝图),其实就是表明一个数据库中的表,它的方法主要有2种,一是针对命令commands的方法,另是针对列columns的方法,命令和列都是一个流Fluent对象,处理命令的方法很少,主要熟悉的是处理列的方法,下面是针对Mysql数据的一些列方法和修饰器
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateAdminsTable extends Migration{ public function up(){ Schema::create('admins', function (Blueprint $table) { $table->charset='utf8mb4'; $table->collation='utf8mb4_unicode_ci'; $table->engine='innodb'; //$table->temporary(); // 上面四条是演示能够单独给某个表指定以上属性 $table->increments('id'); $table->string('name')->comment("用户名"); $table->string('email')->unique()->comment("邮箱必须惟一"); //unique()为索引命令,comment为修饰 $table->string('password',60)->comment("密码最长为60个字节"); $table->rememberToken()->comment("口令"); $table->text('description')->nullable()->comment("管理员说明"); $table->timestamps(); }); } public function down(){ Schema::dropIfExists('admins'); } }
getColumns()
获取蓝图Blueprint
的全部列,每一列也是一个流Fluent
对象,流对象中有type和name两个必须指定addColumn($type, $name, array $parameters = [])
重点讲 removeColumn($name)
getAddedColumns()
获取全部新加的列getChangedColumns()
获取全部改动了的列分类 | 方法 | mysql类型 | 使用说明 |
---|---|---|---|
字符串01 | char(列名, 长度 = null) | char | 定长字符串 |
字符串02 | string(列名, 长度 = null) | varchar | 长度可变字符串 |
字符串03 | text(列名) | text | 支持2^16-1个字节,至关于2.1万个汉字 |
字符串04 | mediumText(列名) | mediutext | 支持2^24-1个字节,至关于560万个汉字 |
字符串05 | longText(列名) | longtext | 支持2^32-1个字节,至关于14亿个汉字 |
实现01: | rememberToken() | varchar(100) | string('remember_token', 100)->nullable() |
实现02: | uuid(列名) | char(36) | |
实现03: | ipAddress(列名) | varchar(45) | |
实现04: | macAddress(列名) | varchar(17) |
Builder::$defaultStringLength
,这个值是能够在服务提供商中修改的分类 | 方法 | mysql类型 | 使用说明 |
---|---|---|---|
整数01 | 参数(列名, 自增加 = false, 无符号 = false) tinyIntegert 和 unsignedTinyInteger |
tinyint | 占1个字节,长度2^8 |
整数02 | integer 和 unsignedInteger | int | 占2个字节,长度2^16 |
整数03 | smallInteger 和 unsignedSmallInteger | smallint | 占3个字节,长度2^24 |
整数04 | mediumInteger 和 unsignedMediumInteger | mediumint | 占4个字节,长度 2^32 |
整数05 | bigInteger 和 unsignedBigInteger | bigint | 占8个字节,长度2^63 |
自增加列01 | increments(列名) unsignedInteger(列名, true) | ||
自增加列02 | tinyIncrements(列名) unsignedTinyInteger(列名, true) | ||
自增加列03 | smallIncrements(列名) unsignedSmallInteger(列名, true) | ||
自增加列04 | mediumIncrements(列名) unsignedMediumInteger(列名, true) | ||
自增加列05 | bigIncrements(列名) unsignedBigInteger(列名, true) | ||
真假 | boolean($column) | tinyint(1) |
分类 | 方法 | mysql类型 | 使用说明 |
---|---|---|---|
单精度浮点数 | float($column, $total = 8, $places = 2) | 弃用 | 单精度必需要指定M和D |
双精度浮点数 | double($column, $total = null, $places = null) | double(M,D) 或double | |
正负定点数 | decimal($column, $total = 8, $places = 2) unsignedDecimal |
decimal(M,D) | 精度和标度必须指定,默认为(8,2) |
分类 | 方法 | mysql类型 | 使用说明 | |
---|---|---|---|---|
日期 | date($column) | date | ||
时间 | time($column) | time | ||
时间 | timeTz($column) | time | ||
日期时间 | dateTime($column, $precision = 0) | datetime(精度) datetime |
||
日期时间 | dateTimeTz($column, $precision = 0) | datetime | ||
时间戳 | timestamp($column, $precision = 0) | timestamp | 用使用useCurrent使用当前时间 | |
时间戳 | timestampTz($column, $precision = 0) | timestamp | ||
时间戳实现 | timestamps($precision = 0){...} | timestamp('created_at', $precision)->nullable();<br>timestamp('updated_at', $precision)->nullable(); | ||
时间戳实现 | timestampsTz($precision = 0){...} | timestampTz('created_at', $precision)->nullable();<br>timestampTz('updated_at', $precision)->nullable(); | ||
时间戳实现 | nullableTimestamps($precision = 0) | 是timestamps的别名 | ||
时间戳实现 | softDeletes(列名 = 'deleted_at',精度 = 0) | |||
时间戳实现 | softDeletesTz($precision = 0) |
日期类型 | 存储空间 | 日期格式 | 日期范围 |
---|---|---|---|
datetime | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 |
timestamp | 4 bytes | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 至 2038 |
date | 3 bytes | YYYY-MM-DD | 1000-01-01 至 9999-12-31 |
year | 1 bytes | YYYY | 1901 至 2155 |
分类 | 方法 | mysql类型 | 使用说明 | |
---|---|---|---|---|
枚举 | enum($column, ['市场部','设计部','总裁办']) | 生成enum('市场部','设计部','总裁办') | ||
json($column) | json | 这是5.7.7后才有的功能 | ||
jsonb($column) | json | 这是5.7.7后才有的功能 | ||
二进制 | binary($column) | blob |
mediumblob
和longblob
,这样储存图片声音等文件没有办法,解决办法是在Schema::create("member", function($table) { // 这里能够放SchemaBuilder支持的各类方法 }); DB::statement("ALTER TABLE member ADD imagedata MEDIUMBLOB");
MySQL 5.7 GIS特性
方法 | mysql类型 | 使用说明 |
---|---|---|
geometry($column) | geometry | |
point($column) | point | |
lineString($column) | linestring | |
polygon($column) | polygon | |
geometryCollection($column) | geometrycollection | |
multiPoint($column) | multipoint | |
multiLineString($column) | multilinestring | |
multiPolygon($column) | multipolygon |
morphs($name, $indexName = null){ $this->unsignedInteger("{$name}_id"); $this->string("{$name}_type"); $this->index(["{$name}_id", "{$name}_type"], $indexName); } nullableMorphs($name, $indexName = null){ $this->unsignedInteger("{$name}_id")->nullable(); $this->string("{$name}_type")->nullable(); $this->index(["{$name}_id", "{$name}_type"], $indexName); }
Nullable
,Default
,Comment
,Unsigned
,VirtualAs
,StoredAs
,Charset
,Collate
,Increment
,After
,First
indexCommand($type, $columns, $index, $algorithm = null)
dropIndexCommand($command, $type, $index)
5种索引的单独命令
命令 | 实际 |
---|---|
primary | indexCommand('primary', $columns, $name, $algorithm) |
unique | indexCommand('unique', $columns, $name, $algorithm) |
index | indexCommand('index', $columns, $name, $algorithm) |
spatialIndex | indexCommand('spatialIndex', $columns, $name) |
foreign | indexCommand('foreign', $columns, $name) |
dropIndex | dropIndexCommand('dropIndex', 'index', $index) |
dropPrimary | dropIndexCommand('dropPrimary', 'primary', $index) |
dropUnique | dropIndexCommand('dropUnique', 'unique', $index) |
dropForeign | dropIndexCommand('dropForeign', 'foreign', $index) |
每个命令都是一个流(Flent)对象,流对象中name必须指定,好比 create()就是在commands增长一个name为create的流对象
处理命令的有: getCommands
获取全部的命令,addCommand
,createCommand
判断是否有create命令creating
对表create
,drop
,dropIfExists
,rename
对表中的列,dropColumn
,renameColumn
php artisan make:migration create_wang04_table --path=database/migrations2
php artisan make:migration create_wang05_table --path=database/migrations2
php artisan migrate --database=mysql2 --path=database/migrations2
php artisan migrate:rollback --database=mysql2 --path=database/migrations2
php artisan migrate:reset --database=mysql2 --path=database/migrations2
php artisan migrate:fresh --database=mysql2 --path=database/migrations2
php artisan migrate:refresh --database=mysql2 --path=database/migrations2
php artisan migrate:status --database=mysql2 --path=database/migrations2
id | migration | batch |
---|---|---|
6 | 2017_11_02_091523_wang01 | 1 |
7 | 2017_11_02_103519_create_json_table | 1 |
8 | 2017_11_02_142016_create_wang01_table | 1 |
9 | 2017_11_02_142040_create_wang02_table | 1 |
10 | 2017_11_02_142103_create_wang03_table | 1 |
11 | 2017_11_02_142928_create_wang04_table | 2 |
12 | 2017_11_02_143043_create_wang05_table | 3 |
13 | 2017_11_02_143104_create_wang06_table | 3 |
Ran? | Migration |
---|---|
Y | 2017_11_02_091523_wang01 |
Y | 2017_11_02_103519_create_json_table |
Y | 2017_11_02_142016_create_wang01_table |
Y | 2017_11_02_142040_create_wang02_table |
Y | 2017_11_02_142103_create_wang03_table |
Y | 2017_11_02_142928_create_wang04_table |
N | 2017_11_02_143043_create_wang05_table |
N | 2017_11_02_143104_create_wang06_table |
数据迁移文件通常与模块放在一块儿,好比你开发了一个模块,有本身的数据表,当别人使用你的模块时,得先将你的数据迁移文件拷贝到应用的指定文件夹下。这样很不方便,因此得在模块的服务提供商文件中写好发布方法
字符集utf8 -- UTF-8 Unicode,排序规则:utf8_general_ci
D:\03www2018\study\myblog\config\database.php
增长以下
//第2个数据库链接 'mysql2' => [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'laravel_study', 'username' => 'zhangxueyou', 'password' => 'liudehua', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ],
GRANT ALL PRIVILEGES ON study_laravel.* TO zhangxueyou@localhost IDENTIFIED BY 'liudehua' WITH GRANT OPTION;
$ sudo service mysql restart
先建好文件夹migrations2
$ php artisan make:migration wang01 --create=study01 --path=database/migrations2
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class Wang01 extends Migration{ public function up(){ Schema::connection('mysql2')->create('study01', function (Blueprint $table) { $table->increments('id'); $table->string('username',25); $table->dateTime('mydatetime')->default(new \Illuminate\Database\Query\Expression('CURRENT_TIMESTAMP')); $table->timestamp('register_time')->useCurrent(); //$table->timestamp('register_time',3); $table->timestamps(); }); } public function down() { Schema::connection('mysql2')->dropIfExists('study01'); } }
vagrant@homestead:~/abcde/study/myblog$ php artisan migrate --database=mysql2 --path=database/migrations2 vagrant@homestead:~/abcde/study/myblog$ php artisan migrate:rollback --database=mysql2 --path=database/migrations2