Laravel框架第2天
复习回顾
了解Laravel:就是用PHP写的框架
安装和使用:必须laravel5.4(php>=5.6) 开启openssl、pdo、mbstring、fileinfo
目录说明
控制器语法:php artisan make:controller 平台名\控制器名Controller
加载视图:return view(视图文件,compact(变量名,变量名,变量名))
脚下留心:
1)打开views下面子文件夹则用点隔开,如:view(‘a.xxx’)
2)优先打开blade模板文件
模板标签:
1)输出变量:{{ $变量名 }}
2)判断循环等潜规则: @标签名 @end标签名
路由
基本语法:Route::请求类型(路径,闭包函数或控制器方法)
匹配指定类型:Route::match([类型1,..,类型n],路径,闭包函数或控制器方法)
匹配任意类型:Route::any(路径,闭包函数或控制器方法)
路由参数语法:Route::请求类型(路径/{参数},闭包函数或控制器方法)->where(参数名,正则)
说明
1)多个参数则在路径处写多个{}即可
2)多个限制则用数组来写,键是参数名,值是对应的正则
路由分组
好处:减少冗余
语法:
Route::group([‘namespace’=>”,’prefix’=>”],function(){
基本语法:Route::请求类型(路径,闭包函数或控制器方法)
基本语法:Route::请求类型(路径,闭包函数或控制器方法)
});
路由别名:
作用:避免后期通过url方法时感觉长
解决:通过as别名
语法:
Route::请求类型(路径,[
‘as’ => 别名,
‘uses’ => 闭包函数或控制器方法
])
后期将url函数替换成 route函数(别名) 就可以自动生成该别名对应的路由
————————————–
输入请求:
Request
$request->all() 获取所有数据
$request->input(键 [, 默认值]) 获取get数据
$request->only([参数名1,…,参数名n]) 获取指定数据
$request->except([参数名1,…,参数名n]) 获取指定数据外的所有数据
Input
Input::all() 获取所有数据
Input::get(键[, 默认值]) 获取get数据
Input::only([键1,…,键n]) 获取指定数据
Input::except([键1,…,键n])获取指定数据外的所有数据
————————-
一、CSRF攻击
1、什么是CSRF攻击
- CSRF(Cross-site request forgery)中文名:跨站请求伪造。
- CSRF是网站攻击的一种,存在巨大的危险性。
2、CSRF攻击场景
1)跨站攻击留言板(随便写一个表单只要知道请求地址和请求参数就可以提交,危险 )
<!DOCTYPE html>
<html>
<head>
<title>测试攻击</title>
</head>
<body>
<form action=”http://localhost/laravel54/public/msg” method=”post”>
<p>
用户名:<input type=”text” name=”uname”/>
</p>
<p>
内容:<input type=”text” name=”content”/>
</p>
<p>
<input type=”submit” value=”提交”/>
</p>
</form>
</body>
</html>
2)实战慕课网攻击
<?php
//1.初始化curl
$ch = curl_init();
//2.配置
// 设置header需要发送的参数
$header = array(
‘Cookie: imooc_uuid=d67f1568-c3c5-4aca-8e4b-5eabd35f8409; imooc_isnew=1; imooc_isnew_ct=1515116337; IMCDNS=0; loginstate=1; apsid=NkNWUxODA2NGM2NzU1ZjdlOGYyN2E2ZjU0ZjE5NzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjIxODQ1OQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZkZDJmNTliMWE2YWE0NGVkMTZiNjQ0Y2ZlODFlMjdmh9dOWnzXTlo%3DNG; PHPSESSID=ph1fngr8r7esumvn9ru5i3ian7; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1515116350,1515116778; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1515117138; cvde=5a4ed8e8b70db-9’
);
curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
curl_setopt($ch, CURLOPT_URL, ‘https://www.imooc.com/article/ajaxpublish’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
$postData = [
‘label_ids’ => 19,
‘title’ => ‘汉子怎么写,小编是不是女dsfsdfs的’,
‘is_original’ => 0,
‘pic’ => ”,
‘content’ => ‘大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费’
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
// https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//3.发送请求
$rs = curl_exec($ch);
//4.关闭释放
curl_close($ch);
echo $rs;
3、防止CSRF攻击
- 防止方案:通过session过滤
- 步骤1:控制器打开视图时候,生成随意唯一的字符串保存在session中的token键中
【控制器(伪代码)】
session_start()
$_SESSION[‘token’] = 随机字符串
return view();
【视图中】
表单隐藏域
<input type=”hidden” value=”{{$_SESSION[‘token’]}}” name=”token” />
- 步骤2:验证表单提交的随机字符串和session中的是否一致
session_start();
if ($_SESSION[‘token’] !== $_POST[‘token’]) {
非法操作
}
Laravel中避免CSRF攻击(留言板案例)
步骤1:打开app\Http\Kernel.php核心文件开启cstf攻击(注:默认已经开启)
步骤2:后期所有post提交的表单都必须增加_token键
了解更多:http://laravelacademy.org/post/6742.html
二、操作提示功能:Laravel 的闪存数据(Flash Data)
1、概念
简单概括:闪存数据指将数据存在session中并且只能读取一次
留言板案例(数据插入状态弹框提示)
控制器
视图
概况
with(键,值) => 相当于 $_SESSION[‘键’] = 值
with([键=>值,..,键n=>值n]) => 相当于批量设置
$_SESSION[‘键1’] = 值1
…
$_SESSION[‘键n’] = 值n
以前PHP存储到session中,通过$_SESSION[‘键’]来获取
问:在Laravel中如何获取?
答:通过session函数,语法:echo session(键)
留言板案例(优雅的弹框)
1)插件
layer插件(闲心)
手册:http://layer.layui.com/hello.html
sweet alert插件
网站:http://mishengqiang.com/sweetalert/
laravel的sweet alert版本:https://github.com/uxweb/sweet-alert
使用
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!–
http://mishengqiang.com/sweetalert/
<style type=”text/css”>
.sweet-alert h2 { line-height: 1px !important }
</style>
–>
<link href=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css” rel=”stylesheet”>
<script src=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert-dev.js”></script>
<script type=”text/javascript”>
swal(“大标题”, “”,”error”)
</script>
</body>
</html>
留言板整合
控制机器
视图
<link href=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css” rel=”stylesheet”>
<script src=”https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert-dev.js”></script>
<script type=”text/javascript”>
{{–@if (session(‘tips’))–}}
{{–alert(“{{ session(‘tips’) }}”);–}}
{{–@endif–}}
@if (session(‘tips’))
swal(“{{session(‘tips’)}}”, “”,”{{session(‘state’)}}”);
@endif
</script>
︴数据库操作学前扩展(foreach遍历Laravel集合对象,会将其属性中的对象赋给 $v)
<?php
//以前:从数据库查询处理,是个二维数组
// $arrData = [
// [‘name’=>’xx’, ‘age’=>19],
// [‘name’=>’xx’, ‘age’=>19],
// [‘name’=>’xx’, ‘age’=>19],
// [‘name’=>’xx’, ‘age’=>19]
// ];
// foreach ($arrData as $key => $arr) {
// #$arr就是数据库的一条条记录, [‘name’=>’xx’, ‘age’=>19]
// #$arr[‘name’] 和 $arr[‘age’]
// }
//—————————————-
//现在:laravel不同(小对象对应数据库的每一条记录)
// 大对象
// {
// 属性名:受保护 => array(
// 0 => 小对象,
// 1 => 小对象,
// 2 => 小对象
// )
// }
//======================
//【小栗子】定义学生类
// class Stu
// {
// public $a = ‘a1’;
// public $b = ‘b2’;
// protected $c = ‘c3’;
// public function d() {}
// }
// //创建对象
// $stuObj = new Stu;
// foreach ($stuObj as $key => $v) {
// print_r($key);
// print_r($v);
// echo ‘<hr />’; //【结论】只有公开的属性才可以
// }
//——————————–
class smallObj
{
public $name = ‘h’;
public $age = ‘hh’;
}
class Stu implements IteratorAggregate
{
protected $items;
public function __construct()
{
$this->items = array(
new smallObj,
new smallObj,
new smallObj
);
}
//说明:实现IteratorAggregate接口里面的抽象方法
//触发:当foreach时候触发
public function getIterator() {
//通过ArrayIterator迭代器遍历$this->items挨个返回给$v
return new ArrayIterator($this->items);//通过ArrayIterator迭代器过滤items属性
}
}
//创建对象
$stuObj = new Stu;
echo ‘<pre>’;
// print_r($stuObj);
foreach ($stuObj as $key => $v) {
print_r($v);
}
三、Laravel数据库操作
1、说明
按照MVC架构理论上数据操作应该在模型中(Model)完成,但对于某些极其复杂的SQL语句,可以使用DB类来操作数据库。
2、操作数据库的三种方式(★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★)
- 使用模型操作(Eloquent ORM)
- 使用原生SQL语句,语法:DB::CURD(SQL语句)
- 使用查询构建器,语法:DB::table(表名)
模型Eloquent ORM 相当于TP D方法
查询构建器 相当于TP M方法
多学一招:实际工作使用M还是D呢?
答:模型,因为减少冗余、增加代码可读性便于维护
3、准备,操作数据库(数据表的创建与配置)
1)创建数据库和表
create database laravel54;
use laravel54;
create table day2_t1(
id int primary key auto_increment comment ‘编号’,
uname varchar(45) not null comment ‘用户名’,
content text not null comment ‘内容’,
created_at int not null default 0 comment ‘创建于’,
updated_at int not null default 0 comment ‘更新于’
)engine=myisam charset=utf8;
2)数据库在laravel框架中的配置(更改数据库配置文件)
3)创建一个Day2Controller.php的控制器
php artisan make:controller Home\Day2Controller
3)设计路由规则
Route::get(‘/db’, ‘Home\Day2Controller@db’);
四、DB类操作数据库(查询构建器、原始SQL语句)
1、【C】增加数据(insert)
语法
- 【 插入多条数据】DB::table(表名)->insert(数组)
- 【插入一条反主键】DB::table(表名)->insertGetId(数组)
2)练习
//【返回状态】插入数据(一条)
//【返回状态】插入数据(多条)
//【返回主键】插入数据(仅能插入一条)
//学习数据库测试方法
public function db()
{
//【返回状态】插入数据(一条)
// $rs = DB::table(‘day2_t1’)->insert([
// ‘uname’ => ‘dsfsdaf’,
// ‘content’ => ‘aaaaaa’,
// ‘created_at’ => time(),
// ‘updated_at’ => time()
// ]);
// var_dump($rs);
//【返回状态】插入数据(多条)
// $rs = DB::table(‘day2_t1’)->insert([
// [‘uname’ => ‘dsfsdaf’, ‘content’ => ‘aaaaaa’],
// [‘uname’ => ‘dsfsdaf’, ‘content’ => ‘aaaaaa’]
// ]);
// var_dump($rs);
//【返回主键】插入数据(仅能插入一条)
$rs = DB::table(‘day2_t1’)->insertGetId([
‘uname’ => ‘dsfsdaf’,
‘content’ => ‘aaaaaa’,
‘created_at’ => time(),
‘updated_at’ => time()
]);
var_dump($rs);
}
【D】删除数据(delete)
1)语法
- 【删除一条】DB::table(表名)->delete(主键)
- 【删除多条】DB::table(表名)->where(字段名,条件,值)->delete()
2)练习
//学习数据库测试方法
public function db()
{
//【删除一条】
// $rs = DB::table(‘day2_t1’)->delete(1);
// var_dump($rs);
//【删除多条】
$rs = DB::table(‘day2_t1’)->where(‘id’, ‘<‘, 5)->delete();
var_dump($rs);
}
【U】修改数据( update)
1)语法
- 【修改多条】DB::table(表名)->update(数组)
- 【修改指定】DB::table(表名)->where(字段名,条件,值)->update(数组)
- 【递增】DB::table(表名)->increment(字段名 [,数字默认1])
- 【递减】DB::table(表名)->decrement(字段名 [,数字默认1])
2)练习
//学习数据库测试方法
public function db()
{
#需求:将id=6的name改成六六六
// $rs = DB::table(‘day2_t1’)->where(‘id’,’=’,6)->update([
// ‘uname’ => ‘六六六’
// ]);
// var_dump($rs);
//脚下留心:php操作数据库特性如果数据已经修改,没有改变则影响0行,至此推荐修改数据的时候加上updated_at字段
// DB::table(‘day2_t1’)->where(‘id’,’=’,6)->increment(‘created_at’);
// DB::table(‘day2_t1’)->where(‘id’,’=’,6)->increment(‘created_at’, 4);
DB::table(‘day2_t1’)->where(‘id’,’=’,6)->decrement(‘created_at’);
DB::table(‘day2_t1’)->where(‘id’,’=’,6)->decrement(‘created_at’, 4);
}
4、【R】查询数据(get)
1)语法
DB::table(表名)
->select(字段名1,..,字段名n) 显示自定的字段 (注:字段名 as 别名)
->where(字段名,条件,值) 多学一招:如果是等于忽略条件,语法:->where(字段名,值)
多学一招:->where([字段名=>值,字段名=>值])
->orderBy(字段名,升序或降序)
->groupBy(字段名) 注:多个则数组
->having(同where)
->skip(数字) 跳过多少条
->take(数字) 获取多少条
或
->offset(数字)
->limit(数字)
->get() 查询所有数据
->first() 查询一条数据
并且where条件语法:->where()->where()
或者where条件语法:->where()->orWhere() 参数统一两个或三个
练习1
- #插入测试数据
INSERT INTO `day2_t1`
VALUES
(‘1’, ‘aa’, ‘aaaa’, ‘0’, ‘0’),
(‘2’, ‘bb’, ‘dfasf’, ‘0’, ‘0’),
(‘3’, ‘cc’, ‘sdf’, ‘0’, ‘0’),
(‘4’, ‘dd’, ‘asdf’, ‘0’, ‘0’),
(‘5’, ‘ee’, ‘asd’, ‘0’, ‘0’),
(‘6’, ‘ff’, ‘adsfasdf’, ‘0’, ‘0’),
(‘7’, ‘ff’, ‘dsf’, ‘0’, ‘0’),
(‘8’, ‘h’, ‘asdf’, ‘0’, ‘0’),
(‘9’, ‘i’, ‘asf’, ‘0’, ‘0’),
(’10’, ‘g’, ‘gsdfg’, ‘0’, ‘0’),
(’11’, ‘k’, ‘dfdf’, ‘0’, ‘0’),
(’12’, ‘l’, ‘dfgsdfg’, ‘0’, ‘0’),
(’13’, ‘m’, ‘g’, ‘0’, ‘0’),
(’14’, ‘n’, ‘dfg’, ‘0’, ‘0’),
(’15’, ‘o’, ‘sfadsf’, ‘0’, ‘0’);
- 例题
#题目1:查询一条数据
#题目2:查询所有数据
#题目3:按照id降序模糊查询content中含有a的数据,最终取2条
//学习数据库测试方法
public function db()
{
echo ‘<pre>’;
#题目1:查询一条数据(直接小对象)
// $data = DB::table(‘day2_t1’)->first();
// print_r($data);
// echo $data->content;
#题目2:查询所有数据(大对象里小对象,如果foreach那么$v 小对象)
// $data = DB::table(‘day2_t1’)->get();
// print_r($data);
#题目3:按照id降序模糊查询content中含有a的数据,最终取2条
$data = DB::table(‘day2_t1’)->where(‘content’, ‘like’, ‘%a%’)->orderBy(‘id’, ‘desc’)->limit(2)->get();
print_r($data);
}
3)练习2:where条件
#题目1:查询id=1(方法一)
#题目2:查询id=1(方法二)
#题目3:查询id>1
#题目4:查询id=1并且name=aa
#题目5:查询id=1或id=2
//学习数据库测试方法
public function db()
{
echo ‘<pre>’;
#题目1:查询id=1(方法一)
// $data = DB::table(“day2_t1”)->where(‘id’, 1)->get();
// print_r($data);
#题目2:查询id=1(方法二)
// $data = DB::table(“day2_t1”)->where(‘id’,’=’, 1)->get();
// print_r($data);
#题目3:查询id>1
// $data = DB::table(“day2_t1”)->where(‘id’,’>’, 1)->get();
// print_r($data);
#题目4:查询id=1并且name=aa
//$data = DB::table(‘day2_t1’)->where(‘id’,1)->where(‘uname’,’aa’)->get();
// $data = DB::table(‘day2_t1’)->where([‘id’=>1,’uname’=>’aa’])->get();
// print_r($data);
#题目5:查询id=1或id=2
$data = DB::table(‘day2_t1’)
->where(‘id’,1)
->orWhere(‘id’,2)
->get();
print_r($data);
}
五、执行任意的SQL语句(可忽略)
1)语法
- DB::select(SQL语句)
- DB::insert(SQL语句)
- DB::update(SQL语句)
- DB::delete(SQL语句)
2)练习
//学习数据库测试方法
public function db()
{
echo ‘<pre>’;
// $data = DB::select(‘select * from day2_t1’);
// print_r($data);
//
// $rs = DB::update(“update day2_t1 set uname = ‘a111’ where id = 1”);
// var_dump($rs);
// $data = DB::insert(“insert into day2_t1 (uname,content) values (‘aaa’, ‘bbbb’)”);
// var_dump($data);
}
模型使用(Eloquent ORM)
说明
- 什么是ORM?
ORM技术主要为了避免手工编写 SQL,直接在对象(Object,O)和关系型数据(Relation, R)之间进行转换(Mapping, M)。
ORM的好处就是使得你的开发几乎不用接触到SQL语句。创建一张表,声明一个对应的类,然后你就只用和这个类的实例进行交互了,至于这个对象里的数据该怎么存储又该怎么获取,通通不用关心。
- 什么是Eloquent ORM?
Eloquent 是 Laravel 中实现ORM的一个名称
大致规则
PHP编写的类 === 库.表
类里面存在属性 === 表.字段
类的实例方法 === 表的操作
类的实例 === 表.记录
2、创建模型
- 语法:php artisan make:model Http\Model\模型名
- 说明:说明模型默认在app目录下,为了方便管理将其放到Model目录中
- 模型属性【★】
#声明表名(必须,注:不写则默认标明复数)
protected $table = 表名 #默认模型对应的表名就是类型(注:类名大写则下划线分割+s)
#声明主键字段名(默认主键为id字段,后期调用find(1),则条件是id=1)
protected $primaryKey = 主键名称
#可被批量赋值的属性(当模型通过create方法创建数据时则必须)
protected $fillable = [字段1,…,字段n]
#是否字段管理created_at和updated_at字段:是-true默认,false-否
public $timestamps = bool
#必须,模型日期列的存储格式(unix时间戳存储)
protected $dateFormat = ‘U’;
注:更改时间戳名称(一般不改)
const CREATED_AT = ‘creation_date’;
const UPDATED_AT = ‘last_update’;
2、初体验控制器调用模型(获取所有数据)
步骤1:创建模型
步骤2:控制器调用模型
3、基本操作
1)添加数据
- 语法
- 方法1:模型名::create(数组)
- 方法2:
$模型名 = new 模型名;
$模型名->字段名 = 值;
…
$模型名->字段名n = 值n;
$模型名->save();
- 练习
- 方法2:
模型
控制器
脚下留心:
1)使用create方法批量设置属性创建数据,必须在模型声明 $fillable属性
2)模型默认托管创建于和更新于 并且 以字符串型插入,如果需要unix时间戳 得声明$dateformat属性
- 方法1:
2)查询操作
- 语法
模型名::下属任意一个方法()
->select(字段名1,..,字段名n) 显示自定的字段 (注:字段名 as 别名)
->where(字段名,条件,值) 多学一招:如果是等于忽略条件,语法:->where(字段名,值)
多学一招:->where([字段名=>值,字段名=>值])
->orderBy(字段名,升序或降序)
->groupBy(字段名) 注:多个则数组
->having(同where)
->skip(数字) 跳过多少条
->take(数字) 获取多少条
或
->offset(数字)
->limit(数字)
->get() 查询所有数据
->first() 查询一条数据
并且where条件语法:->where()->where()
或者where条件语法:->where()->orWhere() 参数统一两个或三个
- 练习
#题目1:查询id=1(方法一)
#题目2:查询id=1(方法二)
#题目3:查询id>1
#题目4:查询id=1并且id=2
#题目5:查询id=1或id=2
//学习数据库测试方法
public function db()
{
#题目1:查询id=1(方法一)
// $day2T1 = Day2T1::where(‘id’, 1)->first();
// echo ‘<pre>’;
// print_r($day2T1);
// #题目2:查询id=1(方法二)
// $day2T1 = Day2T1::where(‘id’,’=’, 1)->first();
// echo ‘<pre>’;
// print_r($day2T1);
#题目3:查询id>1
// $day2T1 = Day2T1::where(‘id’,’>’, 1)->get();
// echo ‘<pre>’;
// print_r($day2T1);
#题目4:查询id=1并且id=2
// $day2T1 = Day2T1::where(‘id’,’=’, 1)
// ->where(‘id’,’=’, 2)
// ->get();
// var_dump($day2T1);
#题目5:查询id=1或id=2
$day2T1 = Day2T1::where(‘id’,’=’, 1)
->orWhere(‘id’,’=’, 2)
->get();
echo ‘<pre>’;
print_r($day2T1);
}
3)修改数据
- 语法
- 方法1:模型名::where()->update(数组)
- 方法2:
$模型名 = 模型名::find(主键)
$模型名->字段名 = 修改值
….
$模型名->save();
模型中查询一条数据:find(主键) 或者 first
模型中查询多条数据:get() 或者 all()
- 练习
#方法1:多条,返回受影响的行数
#方法2:仅修改一条,返回bool($rs);
//学习数据库测试方法
public function db()
{
#方法1:多条,返回受影响的行数
// $rs = Day2T1::where(‘id’, ‘<‘, 5)->update([
// ‘uname’ => ‘a2’
// ]);
// var_dump($rs);
#方法2:仅修改一条,返回bool($rs);
$day2T1 = Day2T1::find(1);
$day2T1->uname = ‘bbbb’;
$day2T1->content = ‘ccccc’;
$rs = $day2T1->save();
var_dump($rs);
}
4)删除数据
- 语法
- 方法1:模型名::where()->delete()
- 方法2:
$模型名 = 模型名::find(主键)
$模型名->delete()
- 练习
//学习数据库测试方法
public function db()
{
$rs = Day2T1::destroy(12);
var_dump($rs);die;
// $rs = Day2T1::where(‘id’, ‘<‘, 6)->delete();
// var_dump($rs);
// $day2T1 = Day2T1::find(6);
// $rs = $day2T1->delete();
// var_dump($rs);
}
︴将数据转化为数组(强烈不推荐使用)
//数据库练习
public function db()
{
echo ‘<pre>’;
#DB first 不可以
// $day2 = DB::table(‘day2_t1’)->first()->toArray();
// dd($day2);
#DB get 可以,数组里面是小对象
// $day2 = DB::table(‘day2_t1’)->get()->toArray();
// print_r($day2);
#模型 first 可以,数组
// $day2 = Day2T1Model::first()->toArray();
// print_r($day2);
#模型 get 可以,数组里面是数组
// $day2 = Day2T1Model::get()->toArray();
// print_r($day2);
#为什么不推荐使用
// $day2 = Day2T1Model::where(‘id’, 1)->first()->toArray();
// print_r($day2);
// if ($day2) {
// //进一步操作
// }
#说明因为容易出现查询不到数据,转化报错 所以尽量不用
}
七、内置分页功能使用
1、说明
项目百分百需要使用分页、为了让开发者更快速开发项目,Laravel提供了paginate方法
练习
控制器
视图
@foreach ($data as $item)
{{ $item->id }}
{{ $item->uname }}
<br />
@endforeach
<hr />
{{ $data->links() }}
3、自定义分页样式(美化分页)
https://www.cnblogs.com/lamp01/p/6869762.html
@foreach ($data as $item)
{{ $item->id }}
{{ $item->uname }}
<br />
@endforeach
<hr />
//CSS样式
<style type=”text/css”>
#pull_right{
text-align:center;
}
.pull-right {
/*float: left!important;*/
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #428bca;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
color: #2a6496;
background-color: #eee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 2;
color: #fff;
cursor: default;
background-color: #428bca;
border-color: #428bca;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #777;
cursor: not-allowed;
background-color: #fff;
border-color: #ddd;
}
.clear{
clear: both;
}
li.active span {background: red !important;}
</style>
//blade模板展示
<div id=”pull_right”>
<div class=”pull-right”>
{!! $data->links() !!}
</div>
</div>
扩展任务
- 自定义错误页面,百度关键词:laravel自定义错误页面
- 搜索功能
- 通过jq日期插件 开始时间 结束时间(http://www.my97.net/demo/index.htm )