laravel3
1. 数据库操作
laravel中,一共提供了三种操作数据库的方式,供我们自由选择。
- 原生SQL查询,就是我们以前使用PDO类进行操作
- DB查询构建器(DB查询构造器),类似我们之前在ThinkPHP学到的连贯操作。
- 模型操作操作( Eloquent ORM ),类似我们之前在ThinkPHP里面的学习的模型操作。
1.1 原生SQL查询
....
1.2 DB查询构造器
DB查询构造器,是Laravel里面我们用来操作数据库的一种最常用的操作方式,甚至后面我们学习模型的时候,也是在模型里面调用DB查询构造器来实现数据操作的。
在Laravel使用DB查询构造器,也是通过DB类来调用的。
所以,也是导入和上面第一种方法中的DB类一样
use Illuminate\Support\Facades\DB; #也可以简写成 use DB;
1.2.1 查询数据
DB::table() #指定要操作的表名
DB::select() #要查询的字段
DB::get() #获取多条数据
DB::first() #查询一条数据
DB::find() #使用主键查询一条数据
控制器代码:

路由代码:

1.2.1.1 按条件查询
代码:

1.2.1.2 多条件查询数据

使用where方法的第四个参数,可以决定多个条件之间是并且还是或者的关系
1.2.2 添加数据
添加有两种,一种是添加单个,使用 insertGetId(); 返回值是新增的ID
另一种是添加多个,使用insert(); 返回值是布尔值
1.2.2.1 添加单条数据

1.2.2.2 添加多条数据

1.2.3 编辑数据

1.2.4 删除数据

1.2.5 连表查询[多表连接]
其实就是DB查询构造器中,使用join关键词拼接SQL语句而已。
DB::table(‘a表’)->join(‘b表’,’a表的外键’,’运算符(=)’,’b表的主键’);
例如,我们这里进行一次查询文章的评论,使用连表操作。
create table comment (
`id` int unsigned not null auto_increment primary key comment '主键',
`aid` int unsigned not null comment '文章ID',
`content` text null comment '评论'
);
添加一些测试数据:
insert into `comment` (`aid`,`content`) VALUES (1,'不错的文章1');
insert into `comment` (`aid`,`content`) VALUES (2,'不错的文章2');
insert into `comment` (`aid`,`content`) VALUES (3,'不错的文章3');
insert into `comment` (`aid`,`content`) VALUES (4,'不错的文章4');
代码:

上面就是我们使用DB查询构造器实现的连表操作。
缺点:连表时需要特别注意表之间的字段冲突,一旦冲突,需要使用大量的别名。
1.2.6 DB查询构造器的实现原理
这种结构的对象其实是方法内部实现了链式调用(链式写法)。
链式写法的关键就是 对象的方法的返回是 return $this;
分析:
要实现DB查询构造器的步骤:
1. 多个方法中,都可以操作同一个数据库链接!( 数据库链接的封装 )
2. 多个方法都要实现链式写法。(只会在最后的方法中,返回真正的数据,其他方法都是return $this )
3. DB查询构造器的本质还是查询数据库,查询数据库的本质还是使用到了SQL语句,
所以,DB查询构造器无非就是在调用不同的操作方法进行sql语句的拼接。
代码:


1.3 Eloquent ORM模型
使用的时候,类似于ThinkPHP的AR模型操作。Laravel中,我们的ORM模型,其实底层还是使用了DB查询构造器。所以DB查询构造器所拥有的方法,那么ORM模型实例化以后,得到的数据对象也会有这些方法。
1.3.1 创建表
我们这里直接使用php25的article表来进行模型的演示操作。
1.3.2 使用工匠指令创建模型
模型的存放位置,默认情况是放在app目录下,建议创建一个app\Http\Models 或 app\Models 这样一个模型目录专门存储模型文件。
创建指令:
php artisan make:model 目录\模型类名
php artisan make:model 目录\模型类名 --resource
php artisan make:model 目录\模型类名 --controller
例如,我们现在要为article表创建一个Article模型,cmd命令行:

效果:

接下来,我们就可以操作这个模型了。
1.3.3 模型的简单使用
模型的操作可以实例化,也可以不进行实例化,使用使用类进行静态操作也是可以的。
但是,强烈建议使用实例化模型来进行操作,因为实例化以后的模型功能更加强大。


路由:

效果:

上面就是我们在没有实例化模型之前的使用方式。
1.3.4 实例化模型及其操作
控制器代码:


操作时要注意:
Laravel会认为,模型的名称是单数单数单词,表名是负数,所以默认情况下,模型对应的表名都是
// 模型名称 + s = 表名,但是这个风格和我们中国人是不一样的,所以我们可以使用模型内置的一个属性来重新定义表名

1.3.5 路由参数与参数模型
路由:

控制器:

效果:

注意:
一般我们会在查询单条数据的时候,直接使用参数模型。(直接根据这个id去查找记录)
参数模型的使用,必须参数名称 和 控制器中参数的名称对应,位置则不需要对应。
1.3.6 ORM模型的关联查询
ORM模型的关联查询是大部分框架提供给我们用来进行多表关联查询的,用于替代传统的join多表连接查询。
优点:可以完美的避免多表查询操作时,带来的字段冲突问题,同时,ORM的关联查询只需要我们在模型中声明表与表之间的关系,一次即可。
分析:
- 表与表之间会存在一对一、一对多(多对一)、多对多的关系,而模型和表是一一对应的,
所以我们可以把这种表之间的关系,声明到模型中。
Laravel提供了以下几个方法,给我们对模型之间的关系进行操作:
hasOne 一对一
hasMany 一对多
belongsTo 属于,用于多对一的
belongsToMany 多对多
ORM的关联查询的使用有两种方式:
1. 懒惰式关联,用于单个数据的连表[一篇文章对应多个评论]
2. 渴求式关联,用于多个数据的连表[查出多篇文章下每个文章的评论]
例如,我们现在数据库有两个表,article和comment是一对多的关系。
那么,我们接下来就可以使用模型来关联他们的关系。
这里,为了演示,再次创建一个comment的模型。
cmd命令行:

模型,代码:

控制器,代码:

路由,代码:

效果:

接下来,如果需要进行多表关联查询,则步骤如下:
1.3.6.1 对有关系的模型进行关联关系
Article模型,代码:

1.3.6.2 懒惰式关联的使用
控制器中,通过Article模型调用comment对应的数据,我们先使用懒惰式关联

效果:

1.3.6.3 渴求式关联的使用【多条文章,多评论】

效果:

2. 综合功能:管理员模块
功能分析:
0. 建表[ 数据迁移(Migration) ]
1. 管理员的添加[ 文件上传、模型添加数据、数据校验(Validation) ]
2. 管理员的列表显示[ 分页 ]
3. 管理员的删除[ 模型删除数据 ]
4. 管理员的编辑[ 模型编辑数据 ]
5. 登录和退出[ 验证码(captcha)、会话技术、防FQ(中间件) ]
2.1 建表
2.1.1 以前建表
create table admin (
`id` int unsigned not null auto_increment comment '主键',
`role_id` smallint unsigned not null comment '角色ID',
`username` varchar(150) not null comment '登录帐号',
`nickname` varchar(150) not null comment '昵称',
`password` varchar(255) not null comment '密码',
`avatar` varchar(255) null comment '头像',
`mobile` varchar(15) not null comment '手机',
`email` varchar(150) not null comment '邮箱',
`sex` tinyint unsigned default 1 comment '性别(1:女,2:男)',
`login_ip` varchar(50) default '' comment '最后登录IP',
`login_number` int unsigned default 0 comment '登录次数',
`remember_token` varchar(255) default '' comment '记住登录',
`updated_at` timestamp null default null comment '登录时间',
`created_at` timestamp null default null comment '创建时间',
`disabled_at` timestamp null default null comment '禁用时间',
`actived_at` timestamp null default null comment '激活时间',
`deleted_at` timestamp null default null comment '删除时间',
primary key(`id`),
unique key(`username`),
unique key(`mobile`),
unique key(`email`)
) engine=InnoDB charset=utf8;
以前的建表是通过SQL来建表的,这种方式,快捷而且简单,但是一旦开始的项目开发,那么必须 所有的开发人员,一旦有任何的修改都要互相复制修改后的数据结构的SQL,所以会给开发的进度带来很多的不便性,所以,Laravel为了避免造成这种请求,提供了一种使用代码来创建表和表结构 以及 管理数据库版本 的技术,这种技术就是 Migration,中文翻译叫“数据迁移”。
2.1.2 使用数据迁移建表
步骤:
- 使用工匠指令来创建一个数据迁移类文件
- 在类文件使用Laravel提供的工具类来书写创建表 和 声明表结构的代码
- 使用工匠指令,执行这个数据迁移类文件
2.1.2.1 创建一个数据迁移类文件
在数据迁移的功能中,一般我们是一个表对应着一个数据迁移类文件,所以创建一个数据迁移类文件,就表示要使用代码创建一张表及表结构。
数据迁移类文件的文件名建议:
create_表名_table
那么,我们如果要创建的表是admin表,则命令就是
php artisan make:migration create_admin_table
cmd命令行:

上面我们就可以看到系统生成的数据迁移文件名的格式“YYYY_mm_dd_HHiiss_create_admin_table.php”
Laravel中所有的数据迁移文件都保存在 /database/migrations/目录中。我们可以找到:

我们创建完成的迁移文件同目录下,也有Laravel提供了两个迁移文件,我们可以删除。
分析文件:
首先,顶部导入了两个类,Schema和 Blueprint,这两个就是Laravel提供给我们用于创建表 和 声明表结构的。
每一个数据迁移类文件默认都拥有两个方法,分别是up 和 down。
up用于执行数据表/表字段的创建和修改工作,表示数据库的版本增加
down用于执行数据表/表字段的删除和恢复工作,表示数据库的版本回滚
接下来,我们就可以在up方法中, 书写创建admin表的代码,主要使用 Schema和 Blueprint 提供的方法来完成操作。
2.1.2.1.1 创建表
Schema::create($table,$callback);
$table 字符串, 要创建的表名
$callback 回调函数,在函数我们要声明表结构
代码:

2.1.2.1.2 声明表结构
Laravel提供了Blueprint工具类,这个类提供了很多以SQL语句的关键词作为方法名的方法给我们用来声明表结构。
代码:

2.1.2.2 执行数据迁移
注意:我们前面已经使用sql语句创建饿了一个admin,所以执行之前,先把数据库中的数据表admin删除。
php artisan migrate
cmd:

效果:

我们可以发现多了两张表。admin 和 migrations。
admin就是我们执行了数据迁移以后,生成的表。
migrations,这个就是Laravel用于自动管理数据库版本的表。每一次执行数据迁移都会在这里删除、添加一些迁移记录,通过这里的记录,就可以达到管理版本的作用。
所以,在migrations表中有记录的表,我们就可以进行回滚、迁移等操作,而如果没有在migrations里面存储记录的表,则Laravel是没办法帮我们管理版本的,例如article 和 comment。
另外几个用于数据迁移的相关的指令:

成功创建了admin表以后,我们通过观察发现,其实avatar 和 nickname字段,其实一开始为空的,所以,我们需要对这个表的字段进行调整?
在Laravel中如果使用了数据迁移,那么对于数据表中的字段属性要调整,怎么调整呢?
- 如果在没有数据的情况下,则我们直接对当前要操作的表进行迁移回滚操作,重新修改我们的数据迁移文件中的代码,重新执行数据迁移即可。
- 如果在有数据的情况下,则我们可以新建一个数据迁移类文件,然后在这个迁移类文件中,对我们的数据表进行字段的修改。
方法二步骤:
2.1.2.2.1 新建数据迁移文件
php artisan make:migration change_admin_field
cmd命令行:

代码:

2.1.2.2.2 执行这个新的迁移文件
php artisan migrate
使用上面的命令即可,但是我们执行在cmd命令行的时候,报错了!错误如下:

上面的报错是因为,我们当前Laravel项目中,并没有支持修改字段的类库,所以我们需要使用composer给Laravel安装一个扩展包。
composer require doctrine/dbal
cmd命令行:

注意,上面的命令是让composer 给Laravel下载安装扩展包(扩展插件),必须要联网并且这个命令必须在 项目的根目录中运行。
安装完成了:

接下来,Laravel就有了上面说的扩展包,接下来,我们重新执行数据迁移。

重新执行,发现成功了。
效果:

同时,我们可以发现,migrations表中也新增了一条记录。

那么,我们可以尝试性的回滚数据迁移,观察下:

其实,本质上说,Laravel就是每次在执行数据迁移的时候,去查询了migrations表,根据这个表的batch字段进行版本的迁移和回滚操作。
作业:使用数据迁移,完成商品表的创建和表字段的定义。
我们使用Laravel的数据迁移,必须保证PHP的环境中,开启的php_fileinfo.dll的扩展,如果没有开启这个fileinfo的扩展,Laravel则会报错!
查找当前命令行中运行的php是哪个?

上面就是找到当前在命令行中使用php.ini的位置了。

浙公网安备 33010602011771号