一、where 派生查询
1. where()
实际上where()
有三个参数,第一个参数是查询字段,第二个参数是符号,第三个参数是字段值,只是通常情况下都是等于条件,所有当是等于条件时,第二个参数一般就忽略不写,并且如果使用它的大于、小于、不等于 等等判断符号,对数据查询的性能也是有影响的,能避免使用就尽量避免使用
public function where(){
$data = DB::table('admin')->where('id',3)->get();
echo '<pre>';
print_r($data);
}
其他符号的使用示例:
$data = DB::table('admin')->where('id','>',3)->get();
$data = DB::table('admin')->where('id','<=',3)->get();
$data = DB::table('admin')->where('id','<>',3)->get();// 这个表示不等于
传入多个条件时,有两种方式:
// 方式一:
$data = DB::table('admin')->where(['username'=>'tom','age'=>25])->get();
echo '<pre>';
print_r($data);
// 方式二:
$data = DB::table('admin')
->where('username','tom')
->where('age',25)
->get();
echo '<pre>';
print_r($data);
2. orWhere()
实现两个或以上的 or 条件查询
$data = DB::table('admin')
->where('age',25)
->orWhere('uid',1)
->get();
echo '<pre>';
print_r($data);
通过闭包,我们还可以构建更加复杂的 orWhere 查询。
以下面这张表为例:
我要查询出uid=1的或者是男性,并且年龄小于25的,最终应该是jack、tom、alice三条数据
$data = DB::table('admin')
->where('uid',1)
->orWhere(function ($query){
$query->where('sex','男')->where('age','<',25);
})->toSql();
echo $data;
生成出来的sql语句如下:
select * from `admin` where `uid` = ? or (`sex` = ? and `age` < ?)
根据sql语句可以看出应该是没有问题的,现在将toSql()
改为get()
:
$data = DB::table('admin')
->where('uid',1)
->orWhere(function ($query){
$query->where('sex','男')->where('age','<',25);
})->get();
echo '<pre>';
print_r($data);
3. whereBetween()
实现区间查询
$data = DB::table('admin')
->select(['username','age'])
->whereBetween('age',[20,25])
->get();
echo '<pre>';
print_r($data);
PS:这里还支持相关三种:whereNotBetween/orWhereBetween/orWhereNotBetween;
4. whereIn()
实现数组匹配查询,比如匹配出数组里指定的数据
// $data = DB::table('admin')
// ->whereIn('score',[69,78])
// ->toSql();
// echo $data;
// select * from `admin` where `score` in (?, ?)
$data = DB::table('admin')
->whereIn('score',[69,78])
->get(['username','age']);
echo '<pre>';
print_r($data);
PS:这里还支持相关三种:whereNotIn/orWhereIn/orWhereNotIn;
5. whereNull()
查询字段为 Null 的记录
$users = DB::table('admin')->whereNull('uid')->toSql();
PS:这里还支持相关三种:whereNotNull/orWhereNull/orWhereNotNull;
6. whereDate()
查询指定日期的记录
$users = DB::table('admin')->whereDate('create_time', '2020-09-11')->toSql();
PS:这里还支持相关四种:whereYear/whereMonth/whereDay/whereTime,支持 or 前缀;
PS:三个参数支持大于小于之类的操作 orWhereDate(‘create_time’,’>’, ‘2018-12-11’)
二、中间件
什么是中间件?中间件就是当程序接收 HTTP 请求时,拦截后进行过滤和处理;
比如当用户登录时,可以通过中间件进行验证比对,错误后让其跳转到登录页面;
框架系统自带了一些中间件,比如之前 CSRF 令牌保护,就是中间件实现的;
如何创建一个自定义的中间件呢?可以通过一句命令创建一个 check 中间件;
php artisan make:middleware Check
一个完整的中间件包含三个过程:
- 创建,可以自己在
Middleware
目录下新建,也可以使用上述命令行创建 注册,在
Kernel.php
的$routeMiddleware
属性中注册触发,在
web.php
中添加Route
示例如下:
// 使用命令创建中间件文件
php artisan make:middleware Check
现在做一个登录身份验证,如果Http收到id=1
的请求,让他进入管理员登录界面,如果没有收到id=1
的请求,就是普通员工
- 创建一个登录控制器,有两个方法,分别控制管理员和普通员工
php artisan make:controller LoginController
class LoginController extends Controller
{
public function index(){
echo '<b>管理员,你好</b>';
}
public function login(){
echo '<b>普通员工,你好</b>';
}
}
Route::get('admin','LoginController@index');
Route::get('login','LoginController@login');
中间件内容,如下:
<?php
namespace App\Http\Middleware;
use Closure;
class Check
{
// 第一行代码是固定格式
public function handle($request, Closure $next)
{
// 中间件拦截请求,如果没有收到这个请求,就让页面跳转到login,普通员工
if($request->get('id')!=1){
return redirect('login');
}
// 这行代码也是固定格式,表示继续往下执行
return $next($request);
}
}
- 注册中间件
protected $routeMiddleware = [
'check' => \App\Http\Middleware\Check::class,
];
- 触发
添加中间件路由,设置触发条件
Route::get('admin','LoginController@index')->middleware('check');
// 这里的check名和注册中间件时取的键名一致
页面效果如下:
只有id=1
时才会进入管理员界面
三、总结Laravel操作数据库常用方法
- 使用原生的方式
<?php
DB::select(...sql语句...);
DB::insert(...sql语句...);
DB::delete(...sql语句...);
DB::update(...sql语句...);
- 使用laravel提供的链式查询
<?php
DB::table('admin')->get();
DB::table('admin')->first();
DB::table('admin')->find(5);
DB::table('admin')->value('username');
DB::table('admin')->pluck('username');
- where语句
<?php
DB::table('admin')->where('id',3)->get();
DB::table('admin')->where(['username'=>'jack','age'=>20])->get();
DB::table('admin')->where('username','jack')->where('age',20)->get()
// 还有where的派生查询,如:orWhere,whereBetween,whereIn
- 查询时,指定查询字段
<?php
DB::table('admin')->limit(3)->get('id','username','age');
DB::table('admin')->limit(2)->get(['id','username','age']);
// first与get用法是一样的,只不过只返回找到的第一条数据
DB::table('admin')->find(5,['username','email']);
// 另外还可以在查询时用select指定查询字段
DB::table('admin')->select('username','age')->where('id',3)->get();
- 增删改
<?php
DB::table('admin')->insert(['username'=>'jack','hobby'=>'book']);
DB::table('admin')->insert([
[...],
[...],
[...].
]);
DB::table('admin')->where('id',5)->delete();
DB::table('admin')->delete(5);
DB::table('admin')->where('id',3)->update(['username'=>'jack','age'=>25]);
- 聚合查询
<?php
DB::table('admin')->max('score');
DB::table('admin')->min('score');
DB::table('admin')->avg('age');
DB::table('admin')->sum('number');
DB::table('admin')->count();
- toSql() 检测sql语句
$data = DB::table('admin')
->where('age',25)
->orWhere('uid',1)
->toSql();
echo $data;
// select * from `admin` where `age` = ? or `uid` = ?