laravel3

1. 数据库操作

laravel中,一共提供了三种操作数据库的方式,供我们自由选择。

  1. 原生SQL查询,就是我们以前使用PDO类进行操作
  2. DB查询构建器(DB查询构造器),类似我们之前在ThinkPHP学到的连贯操作。
  3. 模型操作操作( 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模型

使用的时候,类似于ThinkPHPAR模型操作。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的关联查询只需要我们在模型中声明表与表之间的关系,一次即可。

分析:

  1. 表与表之间会存在一对一、一对多(多对一)、多对多的关系,而模型和表是一一对应的,

   所以我们可以把这种表之间的关系,声明到模型中。

   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 使用数据迁移建表

步骤:

  1. 使用工匠指令来创建一个数据迁移类文件
  2. 在类文件使用Laravel提供的工具类来书写创建表 声明表结构的代码
  3. 使用工匠指令,执行这个数据迁移类文件

 

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中如果使用了数据迁移,那么对于数据表中的字段属性要调整,怎么调整呢?

  1. 如果在没有数据的情况下,则我们直接对当前要操作的表进行迁移回滚操作,重新修改我们的数据迁移文件中的代码,重新执行数据迁移即可。

 

  1. 如果在有数据的情况下,则我们可以新建一个数据迁移类文件,然后在这个迁移类文件中,对我们的数据表进行字段的修改。

方法二步骤:

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的位置了。

posted @ 2017-10-06 19:10  奋斗的黑蜗牛1号  阅读(343)  评论(0)    收藏  举报