前言

laravel5.6学习记录,学习最新的版本

Laravel5.6

数据库

讲了控制器和路由,我们来讲一下数据库.

配置

要使用数据库,当然要先配置,才能连上数据库使用.
数据库的配置主要有两个地方.

  1. .env文件,包涵较多的配置项,当然也包括数据库的信息,
  2. config/database.php 里面包括了数据库、数据库驱动、Redis等.
1
2
3
4
5
6
7
//.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//config/database.php
<?php

return [

'default' => env('DB_CONNECTION', 'mysql'),

'connections' => [

'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],

'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
],

'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
],

],

'migrations' => 'migrations',

'redis' => [

'client' => 'predis',

'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],

],

];

配置项都很简单,数据库名、账号、密码、端口设置上就ok.
配置文件的可读性很高.
database中用的env()函数读取.env文件的配置项.

1
2
3
'default' => env('DB_CONNECTION', 'mysql'),
//env(),传两个参数,第一个是`.env`里的配置项,第二个是默认值.
//如果配置项没有值,就使用设置的默认值.

看你的需求,如果不会更换的就可以写死,也就是写到默认值里,
如果频繁更换,或者线下线上的配置区分,就写到.env里,
上线只需要改一份配置就好了.

.env.gitignore中,是属于git忽略文件,也能保证一些安全问题,这里不细说.

修改配置的时候,我们也可以顺便修改下通用配置.

1
2
3
4
5
6
7
//.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:****************=
APP_DEBUG=true
APP_URL=http://localhost
//名称、环境、是否开启debug(显示一些详细错误信息)、以及域名等.
1
2
3
4
5
6
7
8
//我们主要改几个地方,其他的按照自己的需求
//上面的配置也在app.php中
//config/app.php
//时区默认'UTC'改为'PRC' 中国时区
'timezone' => 'PRC',
//这是语言,如果有其他语言包,本地化需要.
//语言包位于 resources/lang/ 下,默认en
'locale' => 'en',

配置完成,怎么使用呢?

Migration

laravel下使用migration来创建数据库迁移文件…

1
2
3
php artisan make:migration create_protables_table
//如果需要指定表名,可以使用 --create 和 --table.
php artisan make:migration create_protables_table --create=protables

还有我们前面讲模型的时候,-m参数顺便创建的迁移文件.
这也算一种迁移文件的创建.

1
php make:model Protable -m

创建的迁移文件都位于database/migrations 下.

迁移文件里面有up() down()两个方法,up是正向操作,’down’则是反向操作.

我们来添加一些简单的字段.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//database/migrations/2018_02_23_112021_create_protables_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProtablesTable extends Migration
{
public function up()
{
Schema::create('protables', function (Blueprint $table) {
//创建一个protables表
$table->increments('id');
//默认的自增id字段
$table->string('username');
//string() 相当于varchar
$table->string('phone',100)->unique();
//带长度的varchar,unique()不重复
$table->string('password')->commit('密码');
//commit()是注释
$table->integer('user_id')->default(0);
//integer() INTEGER
//default() 是默认值
$table->text('content')->commit('内容');
$table->timestamps();
//timestamps() 会生成以下两个字段
//`created_at` 创建时间
//`updated_at` 更新时间
});
}
public function down()
{
//dropIfExists()逆向操作,如果存在此表就删除
//最好是加上这句.
Schema::dropIfExists('protables');
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//常用的字段修饰
string() 相当于varchar 第一个参数是字段名,第二个参数可带长度(可选)
integer()
text()
boolean() boolean
decimal() double() float() 浮点数
increments() 递增主键(unsigned)
---
//字段修饰符
->commit() 注释
->default() 默认值
->unsigned() UNSIGEND
->unique() UNIQUE
->nullable() 可以为null
->charset('utf8') 指定编码

迁移文件ok了,然后该生成了.

1
php artisan migrate

执行的时候就会执行迁移文件中的up()方法,来创建表.

我们查看下数据库,(图形化还没装),就先用控制台将就看着.

1
2
3
4
| migrations       | //迁移的记录
| password_resets | //默认的找回密码表
| protables | //我们创建的表
| users | //默认的用户表

看到一句成功创建完成.

Migrate错误

有时候也不可能顺风顺水,也会报一些错误.

1
2
3
4
5
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

laravel5.4后使用的默认编码是utf8mb4,
编码区别和数据库版本不同,执行命令的时候,
或许会报以上的错误,解决方法也比较简单.

1
2
3
4
5
6
7
8
9
//app\Providers\AppServiceProvider.php

use Illuminate\Support\Facades\Schema; //use这个

public function boot()
{
//在boot方法中添加
Schema::defaultStringLength(191);
}

完成后,再次执行migrate命令,应该就ok了

迁移回滚

如果麒麟臂过快,不小心就执行了migrate后,不想要了,想要撤回迁移,
也有rollback帮我们解决.

1
php artisan migrate:rollback

执行的时候就会执行迁移文件中的down(),来删除表.

这就方便的回滚了最近的一次migrate操作,一次操作可能会包含多个迁移文件.
如果想限制回滚次数,7次、5次、3次,只需要加上 --step=次数

1
2
php artisan migrate:rollback --step=7
//回滚最近7次迁移操作

是不是很Easy,如果你绝望了,放弃了,需要重构了,没关系,
一个命令解决你问题.

1
2
php artisan migrate:reset
//回滚所有迁移,归零

更新数据表

按业务需求,假如后期需要添加逻辑,需要新的字段,
也不可能一次次回滚来修改,
我们就要来更新数据表了,创建一个新的迁移文件.

需求,添加一个email字段

1
php artisan make:migration add_email_to_protables_table

创建了一个迁移文件,
2018_02_23_124340_add_email_to_protables_table.php

1
2
3
4
5
6
7
8
9
10
public function up()
{
Schema::table('protables', function (Blueprint $table) {
$table->string('email')->unique();
});
}
public function down()
{
Schema::dropIfExists('protables');
}

这里注意,创建表的时候,是Schema::create
修改表的时候,是Schema::table,第一个参数就是表名,
down()里面我们也加上逆向操作需要的,
Schema::dropIfExists就是判断并删除表.

执行迁移命令,查看数据表结构.

ok啦!

Laravel内容丰富、知识也很多,

文章写的可能很杂乱,或许也像抄读文档,见谅.

End.