博客列表 >Laravel的where派生查询以及中间件的意义

Laravel的where派生查询以及中间件的意义

longlong
longlong原创
2020年09月18日 11:02:122042浏览

一、where 派生查询

1. where()

实际上where()有三个参数,第一个参数是查询字段,第二个参数是符号,第三个参数是字段值,只是通常情况下都是等于条件,所有当是等于条件时,第二个参数一般就忽略不写,并且如果使用它的大于、小于、不等于 等等判断符号,对数据查询的性能也是有影响的,能避免使用就尽量避免使用

  1. public function where(){
  2. $data = DB::table('admin')->where('id',3)->get();
  3. echo '<pre>';
  4. print_r($data);
  5. }


其他符号的使用示例:

  1. $data = DB::table('admin')->where('id','>',3)->get();
  2. $data = DB::table('admin')->where('id','<=',3)->get();
  3. $data = DB::table('admin')->where('id','<>',3)->get();// 这个表示不等于

传入多个条件时,有两种方式:

  1. // 方式一:
  2. $data = DB::table('admin')->where(['username'=>'tom','age'=>25])->get();
  3. echo '<pre>';
  4. print_r($data);
  5. // 方式二:
  6. $data = DB::table('admin')
  7. ->where('username','tom')
  8. ->where('age',25)
  9. ->get();
  10. echo '<pre>';
  11. print_r($data);

2. orWhere()

实现两个或以上的 or 条件查询

  1. $data = DB::table('admin')
  2. ->where('age',25)
  3. ->orWhere('uid',1)
  4. ->get();
  5. echo '<pre>';
  6. print_r($data);


通过闭包,我们还可以构建更加复杂的 orWhere 查询。

以下面这张表为例:

我要查询出uid=1的或者是男性,并且年龄小于25的,最终应该是jack、tom、alice三条数据

  1. $data = DB::table('admin')
  2. ->where('uid',1)
  3. ->orWhere(function ($query){
  4. $query->where('sex','男')->where('age','<',25);
  5. })->toSql();
  6. echo $data;

生成出来的sql语句如下:

  1. select * from `admin` where `uid` = ? or (`sex` = ? and `age` < ?)

根据sql语句可以看出应该是没有问题的,现在将toSql()改为get()

  1. $data = DB::table('admin')
  2. ->where('uid',1)
  3. ->orWhere(function ($query){
  4. $query->where('sex','男')->where('age','<',25);
  5. })->get();
  6. echo '<pre>';
  7. print_r($data);


3. whereBetween()

实现区间查询

  1. $data = DB::table('admin')
  2. ->select(['username','age'])
  3. ->whereBetween('age',[20,25])
  4. ->get();
  5. echo '<pre>';
  6. print_r($data);


PS:这里还支持相关三种:whereNotBetween/orWhereBetween/orWhereNotBetween;


4. whereIn()

实现数组匹配查询,比如匹配出数组里指定的数据

  1. // $data = DB::table('admin')
  2. // ->whereIn('score',[69,78])
  3. // ->toSql();
  4. // echo $data;
  5. // select * from `admin` where `score` in (?, ?)
  6. $data = DB::table('admin')
  7. ->whereIn('score',[69,78])
  8. ->get(['username','age']);
  9. echo '<pre>';
  10. print_r($data);


PS:这里还支持相关三种:whereNotIn/orWhereIn/orWhereNotIn;


5. whereNull()

查询字段为 Null 的记录

  1. $users = DB::table('admin')->whereNull('uid')->toSql();

PS:这里还支持相关三种:whereNotNull/orWhereNull/orWhereNotNull;


6. whereDate()

查询指定日期的记录

  1. $users = DB::table('admin')->whereDate('create_time', '2020-09-11')->toSql();

PS:这里还支持相关四种:whereYear/whereMonth/whereDay/whereTime,支持 or 前缀;

PS:三个参数支持大于小于之类的操作 orWhereDate(‘create_time’,’>’, ‘2018-12-11’)

二、中间件

  1. 什么是中间件?中间件就是当程序接收 HTTP 请求时,拦截后进行过滤和处理;

  2. 比如当用户登录时,可以通过中间件进行验证比对,错误后让其跳转到登录页面;

  3. 框架系统自带了一些中间件,比如之前 CSRF 令牌保护,就是中间件实现的;

  4. 如何创建一个自定义的中间件呢?可以通过一句命令创建一个 check 中间件;

    php artisan make:middleware Check


一个完整的中间件包含三个过程:

  1. 创建,可以自己在Middleware目录下新建,也可以使用上述命令行创建
  2. 注册,在Kernel.php$routeMiddleware属性中注册

  3. 触发,在web.php中添加Route


示例如下:

  1. // 使用命令创建中间件文件
  2. php artisan make:middleware Check

现在做一个登录身份验证,如果Http收到id=1的请求,让他进入管理员登录界面,如果没有收到id=1的请求,就是普通员工

  1. 创建一个登录控制器,有两个方法,分别控制管理员和普通员工
  1. php artisan make:controller LoginController
  1. class LoginController extends Controller
  2. {
  3. public function index(){
  4. echo '<b>管理员,你好</b>';
  5. }
  6. public function login(){
  7. echo '<b>普通员工,你好</b>';
  8. }
  9. }
  1. Route::get('admin','LoginController@index');
  2. Route::get('login','LoginController@login');

中间件内容,如下:

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class Check
  5. {
  6. // 第一行代码是固定格式
  7. public function handle($request, Closure $next)
  8. {
  9. // 中间件拦截请求,如果没有收到这个请求,就让页面跳转到login,普通员工
  10. if($request->get('id')!=1){
  11. return redirect('login');
  12. }
  13. // 这行代码也是固定格式,表示继续往下执行
  14. return $next($request);
  15. }
  16. }
  1. 注册中间件
  1. protected $routeMiddleware = [
  2. 'check' => \App\Http\Middleware\Check::class,
  3. ];
  1. 触发

添加中间件路由,设置触发条件

  1. Route::get('admin','LoginController@index')->middleware('check');
  2. // 这里的check名和注册中间件时取的键名一致

页面效果如下:

只有id=1时才会进入管理员界面


三、总结Laravel操作数据库常用方法

  • 使用原生的方式
  1. <?php
  2. DB::select(...sql语句...);
  3. DB::insert(...sql语句...);
  4. DB::delete(...sql语句...);
  5. DB::update(...sql语句...);
  • 使用laravel提供的链式查询
  1. <?php
  2. DB::table('admin')->get();
  3. DB::table('admin')->first();
  4. DB::table('admin')->find(5);
  5. DB::table('admin')->value('username');
  6. DB::table('admin')->pluck('username');
  • where语句
  1. <?php
  2. DB::table('admin')->where('id',3)->get();
  3. DB::table('admin')->where(['username'=>'jack','age'=>20])->get();
  4. DB::table('admin')->where('username','jack')->where('age',20)->get()
  5. // 还有where的派生查询,如:orWhere,whereBetween,whereIn
  • 查询时,指定查询字段
  1. <?php
  2. DB::table('admin')->limit(3)->get('id','username','age');
  3. DB::table('admin')->limit(2)->get(['id','username','age']);
  4. // first与get用法是一样的,只不过只返回找到的第一条数据
  5. DB::table('admin')->find(5,['username','email']);
  6. // 另外还可以在查询时用select指定查询字段
  7. DB::table('admin')->select('username','age')->where('id',3)->get();
  • 增删改
  1. <?php
  2. DB::table('admin')->insert(['username'=>'jack','hobby'=>'book']);
  3. DB::table('admin')->insert([
  4. [...],
  5. [...],
  6. [...].
  7. ]);
  8. DB::table('admin')->where('id',5)->delete();
  9. DB::table('admin')->delete(5);
  10. DB::table('admin')->where('id',3)->update(['username'=>'jack','age'=>25]);
  • 聚合查询
  1. <?php
  2. DB::table('admin')->max('score');
  3. DB::table('admin')->min('score');
  4. DB::table('admin')->avg('age');
  5. DB::table('admin')->sum('number');
  6. DB::table('admin')->count();
  • toSql() 检测sql语句
  1. $data = DB::table('admin')
  2. ->where('age',25)
  3. ->orWhere('uid',1)
  4. ->toSql();
  5. echo $data;
  6. // select * from `admin` where `age` = ? or `uid` = ?
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议