文章目录
- 一、开发环境配置
- 二、核心要点
- 2.1 Laravel项目创建
- 2.2 Laravel路由
- 2.3 Laravel控制器
- 2.4 Laravel数据库
- 2.5 Laravel模型
- 2.6 Laravel中间件
- 2.7 表单伪造与CSRF保护
一、开发环境配置
1.1 PHP运行环境
常用PHP开发集成环境,选择其一者安装,安装与配置详见对应的官方网站文档
- XAMPP:集成 Apache + MariaDB + PHP + Perl
- WAMPSERVER:集成 Apache + MySQL + PHP
1.2 Composer依赖管理工具
PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。当然也集成了Laravel框架依赖。
不同的操作系统对应不同的操作对应不同的安装方式,详细见官方文档
1.2 Laravel 运行环境
- 通过上步安装的Composer依赖管理工具来安装Laravel全局运行环境,在命令窗口执行:
composer global require laravel/installer
命令行 - 配置Laravel的全局环境变量:
- macOS: $HOME/.composer/vendor/bin
- Windows: %USERPROFILE%\AppData\Roaming\Composer\vendor\bin
1.4 Debugbar调试工具
- 在终端输入以下命令行进行安装
composer require barryvdh/laravel-debugbar
- 向项目文件中新增debugbar调试工具的配置文件
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
- 调试工具的开关项在config/debugbar.php文件以下选项
'enabled' => env('DEBUGBAR_ENABLED',true)
二、核心要点
2.1 Laravel项目创建
composer create-project --prefer-dist laravel/laravel blog
2.2 Laravel路由
按照前端输入的URL进行不同的响应
- app/Http/Controllers 创建控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Home extends Controller
{
public function home() {
return view('home');
}
}
Artisan命令创建控制器:
php artisan make:controller Home
- routes/web.php 创建路由
<?php
use Illuminate\Support\Facades\Route;
use App\HttP\Controllers\Home; // 引入Home控制器
use App\HttP\Controllers\List;
Route::get('/',[Home::class, 'home']);
Route::get('/list/{lid}',[Details::class, 'details']);
// get方法:GET方式获取响应
Route::get('/index', function (){
return 'Laravel Hello!';
});
/* --- 知识扩展 --- */
// any方法:智能接收所有响应
Route::any('/index',function (){
return 'Laravel Hello!';
});
// match方法:指定提交方式
Route::match(['get','post'],'/index',function (){
return 'Laravel Hello!';
});
// {参数}:动态路由,动态传递路由参数
Route::get('index/{id}', function ($id){
return '路由参数ID:'.$id;
});
// 常规路由绑定控制器
Route::get('/test', [TestController::class,'index']);
// 带参数路由绑定控制器
Route::get('/read/{id}',[TestController::class,'read']);
// 单个参数路由制定规则
Route::get('/read/{id}',[TestController::class,'read'])
->where('id','[0-9]+');
// 多个参数路由制定规则
Route::get('/read/{id}/{name}',[TestController::class,'read'])
->where(['id'=>'[0-9]+', 'name' => '[a-z]+']);
// 路由重定向 302临时跳转
Route::redirect('/index','/test');
// 路由重定向方式一 301永久跳转
Route::redirect('/index','/test', 301);
// 路由重定向方式二 301永久跳转
Route::permanentRedirect('/index','/test');
// 视图路由,直接跳转至指定页面
Route::view('/index','index');
// 助手函数实现页面跳转
Route::get('/index', function (){
return view('index');
});
代码说明:
- 常规路由标识:’/ ’
- 带参数路由标识:’/list/{ lid }’
- [Home::class,‘home’] :
- Home::class 指定控制器的类名
- ‘home’ 类的方法
2.2.1 路由命名
将设计好的路由赋予一个类似变量形式名称,采用name('路由名称')
方法,在路由跳转或应用于其他业务时,填写该路由名称可跳转至指定路由,其作用是采用路由名称的方式时方便对路由路径的修改,无论如何变化,路由名称不会改变。
- routes/web.php 对路由进行命名
Route::get('/test/url','TestController@url')
->name('test.url');
- app/Http/Controllers TestController控制器
<?php
namespace App\Http\Controllers;
class TestController extends Controller
{
public function url() {
$url = route('test.url'); // 获取URL地址的助手函数
return $url;
}
}
- 非官方约定命名方式:name(‘控制器名.方法名’)
- route( )为助手函数,用于获取路由生成的URL地址
2.2.2 路由分组
路由分组是让多个路由共享路由属性
- 空分组路由
Route::group([], function (){
Route::get('/test/http','TestController@http');
Route::get('/test/url','TestController@url');
});
- 路径前缀路由分组
Route::prefix('api')->group(function (){
Route::get('/test/http','TestController@http');
Route::get('/test/url','TestController@url');
});
- 中间件路由分组
Route::middleware('middle')->group(function (){
Route::get('/test/http','TestController@http');
Route::get('/test/url','TestController@url');
});
- 子域名路由分组
Route::domain('localhost')->group(function (){
Route::get('/test/http','TestController@http');
Route::get('/test/url','TestController@url');
});
- 命名空间路由分组
Route::namespace('User')->group(function (){
Route::get('/user','User@user');
});
- 路由命名路由分组
Route::name('test.')->group(function (){
Route::get('/test/http','TestController@http')->name('http');
});
2.2.3 回退路由
当用户由于失误,输入错误路由地址,页面跳转"Not Found 404"页面,这时可采取回退路由方式来挽回该错误操作
- routes/web.php 回退路由
Route::fallback(function (){
return redirect('/');
});
必须把回退路由放在所有路由的底层
2.2.4 路由重定向
return redirect()->to('/index');
常规跳转return redirect()->back('/index');
路由返回跳转return redirect('/index');
简写跳转return redirect()->route('Index.home');
路由命名跳转return redirect()->action('UserController@user');
跳至控制器return redirect()->away('http://www.baidu.com');
跳至外部链接return Redirect::to('/index')
Facade模式跳转
2.3 Laravel控制器
2.3.1 单行为控制器
根据设计的要求,定义一个只执行一个方法的控制器称为单行为控制器,使用__invoke()
方法进行创建。
- app/Http/Controllers OnlyController控制器
<?php
namespace App\Http\Controllers;
class OnlyController extends Controller
{
public function __invoke()
{
return 'Only';
}
}
Artisan命令创建控制器:
php artisan make:controller OnlyController --invokable
- routes/web.php 设计路由访问单一控制器
Route::get('/only','OnlyController');
2.3.2 响应配置
服务器向客服端返回数据时可使用response()
来配置响应的格式
- 响应数据为JSON格式
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function http() {
$arr = ['name'=>'Lucy','age'=>'18'];
return response() ->json($arr);
}
}
- 设置响应状态码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function http() {
$arr = ['name'=>'Lucy','age'=>'18'];
return response($arr,201);
}
}
- 设置响应头信息
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function http() {
$arr = ['name'=>'Lucy','age'=>'18'];
$html = '<div><p>Header</p><div>';
return response($html);
}
}
2.4 Laravel数据库
- Wampserver集成环境的MySQL环境配置
找到Wampserver安装目录下的MySQL文件的bin文件的路径,将其绝对路径赋值其系统环境的Path配置中,完成此操作后可方便通过编辑器的终端访问
- .env 设置配置内容
...其他配置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dessert // 数据库名
DB_USERNAME=root // 用户名
DB_PASSWORD=123456 // 密码
...其他配置
- database/migrations 创建数据迁移文件
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCakesTable extends Migration
{
public function up()
{
// 创建表
Schema::create('cakes', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('type'); // 表的type字段
$table->string('size'); // 表的size字段
$table->string('name'); // 表的name字段
});
}
public function down()
{
Schema::dropIfExists('cakes');
}
}
Artisan命令创建控制器:
php artisan make:migration create_cakes_table
- 将数据迁移中的数据同步到数据库中
php artisan migration
- 向已创建的数据迁移的表中添加新字段,并同步数据库
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddPriceToCakesTable extends Migration
{
public function up()
{
// 指向需要添加新字段的表
Schema::table('cakes', function (Blueprint $table) {
$table->integer('price'); // 新字段price
});
}
public function down()
{
Schema::table('cakes', function (Blueprint $table) {
});
}
}
php artisan migration
Artisan命令创建控制器:
php artisan make:migration add_price_to_cakes_table
Top: 类似 ‘add_price_to_cakes_table’ 的命名是具有相关规范
2.4.1 查询构造器-查询方法
- table( ) 指定需要操作的表
$db = DB::table('users');
- get( ) 获取指定表的所有数据
$db = DB::table('users')->get();
- first( ) 查询指定表的第一条数据
$db = DB::table('users')->first();
- value( ‘value’ ) 获取指定表的第一条数据的指定字段名对应的值
$db = DB::table('users')->vaule('uname');
- find( id ) 获取指定表的对应id的一条数据
$db = DB::table('users')->find(5);
- pluck( ‘value’ [,key] ) 获取指定表符合对应字段的所有数据单列值集合
$db = DB::table('users')->pluck('uname');
$db = DB::table('users')->pluck('uname','uid');
2.4.2 查询构造器-分块方法
chunk( ) 对于过多的数据方便读取,使用该方法对大量数据进行分块操作
DB::table('user')->orderBy('id')->chunk(3,function ($user){
foreach ($user as $item){
echo $item -> username;
}
});
2.4.3 查询构造器-聚合方法
- count( ) 获取指定表的数据总数
$db = DB::table('user')->count();
- avg( ‘value’ ) 获取指定表的符合字段名的所有数据平均值
$db = DB::table('user')->avg('wage');
- max( ‘value’ ) 获取指定表的符合字段名的数据最大值
$db = DB::table('user')->max('wage');
- min( ‘value’ ) 获取指定表的符合字段名的数据最小值
$db = DB::table('user')->min('wage');
- sum( ‘value’ ) 获取指定表的符合字段名的所有数据总和
$db = DB::table('user')->sum('wage');
- exists( ) 获取指定表的查询的记录是否存在,返回布尔值
$db = DB::table('user')->where('uname','Lucy')->exists();
- doesntExist( ) 获取指定表的查询的记录是否存在,返回取反的布尔值
$db = DB::table('user')->where('uname','Lucy')->doesntExist();
2.4.4 查询构造器-select与where
2.4.4.1 select查询
- select( ) 查询指定字段的列数据和给字段名取别名
// 1.查询指定字段数据
$db = DB::table('user')->select('uname','email')->get();
// 2.字段名取别名
$db = DB::table('user')->select('uname as name')->get();
- addSelect( ) 在已有的构建器表达式上增加查询规则
$db = DB::table('user')->select('uname','email');
$newdb = $db->addSelect('age')->get();
- DB::raw( ) 写入
select()
方法中可实现原生表达式的查询规则
$db = DB::table('user')
->select(DB::raw('COUNT(*) AS count, gender'))
->groupBy('gender') // 分组
->get();
- selectRaw( ) 直接使用该方法实现原生表达式的查询规则
$db = DB::table('user')
->selectRaw('COUNT(*) AS count, gender')
->groupBy('gender') // 分组
->get();
- havingRaw( ) 对于查询的结果进行精准筛选分组
$db = DB::table('user')
->selectRaw('COUNT(*) AS count, gender')
->groupBy('gender') // 分组
->havingRaw('count >3')
->get();
2.4.4.2 where查询
- where( ) 条件查询,查询数据的数据更加详细
// '=' 操作符
$db = DB::table('user')->where('age', '=' ,25)->get();
// '>' 与 '<' 操作符
$db = DB::table('user')->where('age', '>' ,18)->get();
// '>=' 与 '<=' 操作符
$db = DB::table('user')->where('age', '<=' ,18)->get();
// 'like' 操作符
$db = DB::table('user')->where('name', 'like' ,'%明%')->get();
- 当有多个查询条件时,可使用数组形式
$db = DB::table('user')
->where([
['age', '>=' ,'20',],
['sex', '=' , '女']
])
->get();
- orWhere( ) 可通过连缀方式实现两个及两个以上的
or
条件查询
$db = DB::table('user')
->where('age', '>=' ,'25')
->orWhere('sex', '=' , '女')
->get();
- 闭包形式的复杂
or
条件查询
$db = DB::table('user')
->where('age', '>=' ,'25')
->orWhere(function ($or) {
$or -> where('sex','=','女')
-> where('name', 'like','%敏%');
})
->get();
- whereBetween( ) 可进行区间内的数据查询
$db = DB::table('user')
->whereBetween('age',[18, 25])
->get();
- orWhereBetween( ) 区间内的or数据查询
- whereNotBetween( ) 非区间内的数据查询
- orWhereNotBetween( ) 非区间内的or数据查询
- whereIn( ) 可实现匹配数组中指定数据的查询
$db = DB::table('user')
->whereIn('id',[20, 25, 30])
->get();
- orWhereIn( ) 数组指定数据or查询
- whereNotIn( ) 非数组指定数据查询
- orWhereNotIn( ) 非数组指定数据or查询
- whereNull 可查询值为NULL的数据
$db = DB::table('user')
->whereNull('id')
->get();
- whereNotNull( ) 非NULL的数据查询
- orWhereNotNull 非NULL的数据or查询
- orWhereNull( ) NULL数据的or查询
- whereDate( ) 可按照日期进行数据查询
$db = DB::table('user')
->whereDate('created_at','2021-6-10')
->get();
- whereYear( ) 按照年份查询
- orWhereYear( ) 按照年份or查询
- whereMonth( ) 按照月份查询
- orWhereMonth( ) 按照月份or查询
- whereDay( ) 按照日查询
- orWhereDay( ) 按照日or查询
- whereTime( ) 按照时间查询
- orWhereTime( ) 按照时间or查询
2.4.5 查询构造器-排序分组
- whereColumn( ) 实现两个字段相等的查询
$db = DB::table('user')
->whereColumn('created_at','updated_at')
->get();
- orderBy( ) 实现正序
asc
与倒序desc
排序操作
$db = DB::table('user')
->orderBy('id','desc')
->get();
- latest( ) 实现以默认
created_at
字段时间为准的倒序排序
$db = DB::table('user')
->latest()
->get();
- inRandomOrder( ) 随机排序
$db = DB::table('user')
->inRandomOrder()
->get();
- **skip( )**输出位置 与 **take( )**输出条数,限制结果集的输出方式一
$db = DB::table('user')
->skip(3)
->take(5)
->get();
- **offset( )**输出位置 与 **limit( )**输出条数,限制结果集的输出方式二
$db = DB::table('user')
->offset(2)
->limit(3)
->get();
- when( ) 实现条件判断执行对应查询语句
$db = DB::table('user')
->when(true,
function ($que){
$que -> where('name', '=', 'Lucy');
}, function ($que) {
$que -> where('name', '=', 'Tom');
}
)
->get();
2.4.6 查询构造器-子查询
子查询,又叫内部查询,当一个查询是另一个查询的条件时,称之为子查询。
$db = DB::table('user')
->whereExists(function ($que){
$que -> from('books')
-> whereRaw('product.uid = users.id');
})
->get()
2.4.7 查询构造器-join查询
- join( ) 查询出两个表的交集
$db = DB::table('user')
->join('jobs','jobs.uid','=', 'user.id')
->join('hobby','hobby.uid', '=', 'user.id')
->get();
- leftjoin( ) 查询出两个表的交集,外加左表剩下的数据
$db = DB::table('user')
->leftjoin('jobs','jobs.uid','=', 'user.id')
->get();
- rightjoin( ) 查询出两个表的交集,外加右表剩下的数据
$db = DB::table('user')
->rightjoin('hobby','hobby.uid', '=', 'user.id')
->get();
- union( ) 实现两个查询的取消重复合并操作
$db1 = DB::table('user')
->where('user.age', '>', 18 );
$db2 = DB::table('user')
->where('user.sex', '=', '女')
->union($db1)
->get();
- unionAll( ) 实现两个查询的非取消重复合并操作
$db1 = DB::table('user')
->where('user.age', '>', 18 );
$db2 = DB::table('user')
->where('user.sex', '=', '女')
->unionAll($db1)
->get();
2.4.8 查询构造器-增删改操作
2.4.8.1 增加操作
- insert( ) 在表中新增一条或多条数据
// 新增一条数据
$db = DB::table('user')
->insert([
'name' => '只狼',
'password' => '123456',
'email' => 'langzhi@foxmail.com',
'details' => '打铁匠'
]);
// 新增多条数据
$db = DB::table('user')
->insert(
[
'name' => '只狼',
'password' => '123456',
'email' => 'langzhi@foxmail.com',
'details' => '打铁能手'
],
[
'name' => '赤鬼',
'password' => '123456',
'email' => 'guichi@foxmail.com',
'details' => '狗刨坑'
]
);
- insertOrIgnore( ) 新增数据时忽略重复插入数据的错误
$db = DB::table('user')->insertOrIgnore([
'id' => 100,
'username' => '只狼',
'password' => '741852',
'email' => '741852@foxmail.com',
'details' => '武艺高强'
]);
- insertGetId( ) 获取的表中添加数据后自增的id
$db = DB::table('user')
->insertGetId([
'username' => '佛雕者',
'password' => '741852',
'email' => '666666@foxmail.com',
'details' => '隐市高手'
]);
2.4.8.2 更新操作
- update( ) 更新表中已存数据内容
$db = DB::table('user')
->where('id',100)
->update([
'password' => '741852',
'details' => '武艺精湛'
]);
- updateOrInsert( ) 表中存在数据则更新,不存在则新增
$db = DB::table('user')
->updateOrInsert(
[
'id' => 101
],
[
'username' => '佛雕师',
'password' => '123456',
'details' => '前任修罗'
]
);
- increment( ) 针对某字段数据加载表时自增指定值,默认自增1
$db = DB::table('user')
->where('id',100)
->increment('count');
- decrement( ) 针对某字段数据加载表时自减指定值,默认自减1
$db = DB::table('user')
->where('id',100)
->decrement('count',5);
2.4.8.3 删除操作
- delete( ) 删除表中数据
// 删除表中指定的一行数据
$db = DB::table('user')
->where('id',101)
->delete();
// 清空表数据
$db = DB::table('user')
->delete();
2.5 Laravel模型
Laravel框架可使用Eloquent ORM关系对象模型,进行数据库交互
2.5.1 Eloquent ORM-创建模型
- app/Models 创建和数据库交互相关的Model文件
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Cake extends Model
{
use HasFactory;
protected $table = 'cakes'; // 指定表
}
Artisan命令创建:
php artisan make:model Cake
- 相关控制器引入该Model文件,可对数据的表进行操作
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Cake; // 引入Model
class Cakes extends Controller
{
public function cakes(Request $request)
{
$cakeDate = Cake::all();// 获取Model指定表全部数据
// 获取查询字符串
$name = $request->name;
return view('cakes',[
'name' => $name,
'cakeData' => $cakeDate,
]);
}
}
2.5.2 Eloquent ORM-默认配置
protected $table = 'table';
指定对应的数据库表名protected $primaryKey = 'uid';
修改默认的主键public $incrementing = false;
取消int类型的主键默认自增功能protected $keyType = 'string';
取消主键默认功能需重设string类型public $timestamps = false;
取消created_at与updated_at字段的更新const CREATED_AT = 'c_time';
修改created_at字段名const UPDATEd_AT = 'u_time';
修改updated_at字段名protected $dateFormat = 'U';
自定义时间戳格式protected $connection = 'mysql2';
局部的更改数据库连接protected $fillable = ['name','email',...]
数据库字段白名单
2.5.3 Eloquent ORM-作用域
2.5.3.1 本地作用域
在查找数据编写了大量重复的相同查询语句,并该重复的查询语只运用于当前模型中,而不应用于其他的模型时,此时就可使用本地作用域的方式,将重复多次使用的查询语句进行封装
- app/Models/User.php 本地作用域查询语句的封装
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function scopeSex($que, $val){
$que -> where('gender','男');
}
}
本地作用域方法命名规则:scope + ‘语义名’
- app/Http/Controllers/DBController.php 引用本地作用域封的装查询语句
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::sex('男')
->where('age', '>', 18 )
->get();
return [$db];
}
}
2.5.3.2 全局作用域
与本地作用域相对,在全局作用域中封装查询方法,可提供所用模型引用
- app/Scopes/ageScope.php 全局作用域查询语句的封装
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class ageScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder -> where('age', '>', '18');
}
}
- app/Http/Model/User.php 开启全局作用域
<?php
namespace App\Http\Models;
use App\Scopes\ageScope;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 开启全局作用域
protected static function booted()
{
parent::booted();
static::addGlobalScope(new ageScope());
}
}
- app/Http/Controllers/DBController.php 引用全局作用域封的装查询语句
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::get();
return [$db];
}
}
2.5.4 Eloquent ORM-访问器
访问器是运用在查询得到的数据,通过拦截数据进行修改的一系列行为
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function getUnameAttribute($val)
{
return 'name:'.$val;
}
}
访问器方法命名规则:get + ‘字段名’ +Attribute
2.5.5 Eloquent ORM-修改器
修改器是运用在把数据写入到数据库中时,通过拦截数据进行修改后再写入的一系列行为
- app/Http/Models/User.php 创建修改器
<?php
namespace App\Http\Models;
use App\Scopes\ageScope;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 字段白名单
protected $fillable = [
'username',
'password',
'gender',
'details',
'email'
];
// 修改器
public function setUnameAttribute($val){
$this -> attributes['uname'] = strtoupper($val);
}
}
- app/Http/Controllers/DBController.php 向数据库新增数据
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::create(
[
'uame' => '曼玉',
'sex' => '女',
'email' => 'manyu@foxmail.com',
'password' => '123456',
]
);
return [$db];
}
}
2.5.6 Eloquent ORM-集合
集合是一个更具读取性和处理能力的数组封装,数据的集合提供了大量的方法以便于开发者使用操作,其中数据库对象可返回数据集合也可开发者自己创建数据集合
2.5.6.1 创建集合
// 使用collect()助手函数创建
$collection = collect(['只狼','佛雕师','鬼刑部']);
2.5.6.2 常用集合方法
- map( ) 遍历集合数据,对数据进行批次修改
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> map(function ($val, $key) {
return "$key - $val";
});
}
}
- filter( ) 筛选判断值为true的对应值,并输出该值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> filter(function ($val, $key) {
return $val === '只狼';
});
}
}
- reject( ) 筛选判断值为true的对应值,并输出除了该值的其他值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> reject(function ($val, $key) {
return $val === '只狼';
});
}
}
- search( ) 搜索集合的指定值,找到后返回该值的
key
,否者返回false
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> search('义父');
}
}
- chunk( ) 对集合进行指定值的分割
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> chunk(3);
}
}
- each( ) 迭代输出集合值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
return $col -> each(function ($val){
echo $val;
});
}
}
- all( ) 转换为数组的形式输出
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(['只狼','佛雕师','鬼刑部','义父']);
dd($col->all());
}
}
- avg( ) 计算集合值的平均值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->avg();
}
}
- count( ) 返回集合总数
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->count();
}
}
- countBy( ) 返回集合中数值出现的次数或回调函数指定值的出现次数
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->countBy();
}
}
- diff( ) 返回两个集合中的不同的值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->diff([10,40]);
}
}
- duplicates( ) 返回集合中的重复值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,20,30,40,40]);
return $col->duplicates();
}
}
- first( ) 返回判断值为true的所有值中的第一个值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->first(function ($val){
return $val >= 20;
});
}
}
14.flatten( ) 将多维数组转换为一维数组
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([[10,20],[30,40]]);
return $col->flatten();
}
}
- get( ) 通过
key
值找到集合中的value
值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(
[
'one' => '只狼',
'two' => '佛雕师'
]);
return $col->get('one');
}
}
- has( ) 判断集合中是否存在指定
key
,有则返回1无则返回空字符
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect(
[
'one' => '只狼',
'two' => '佛雕师'
]);
return $col->has('two');
}
}
- pop( ) 移出集合中的最后一个值,并返回该被移除的值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40]);
return $col->pop();
}
}
- slice( ) 返回指定值后续的集合值
<?php
namespace App\Http\Controllers;
class DBController extends Controller
{
public function sql()
{
$col = collect([10,20,30,40,50]);
return $col->slice(2);
}
}
- 集合方法多达百种,更多的方法参阅官方文档-综合话题-集合
- 以上是以创建的集合为示例,集合方法也可用在数据模型集合
2.5.7 Eloquent ORM-模型关联
模型关联是运用在两张及以上的表进行有规则性的绑定关联
2.5.7.1 模型的一对一关联
一对一关联,指主表的单个数据对应关联副表的单个数据
2.5.7.1.1 正向一对一关联
- app/Http/Models/Jobs.php 新建副表数据模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Jobs extends Model
{
protected $table = 'job';
}
- app/Http/Models/User.php 关联副表的模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function jobs(){
return $this->hasOne(Jobs::class,'user_id','id');
}
}
hasOne( 副表模型类名, 外键名, 主键名 )
- app/Http/Controller/DBController.php 两表的一对一关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::find(10)->jobs;
return $db;
}
}
2.5.7.1.2 反向一对一关联
- app/Http/Models/Jobs.php 新建副表的数据模型并关联主表
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Jobs extends Model
{
protected $table = 'jobs';
public function user(){
return $this->belongsTo(User::class,'user_id','id');
}
}
belongsTo( 主表模型类名, 外键名, 主键名 )
- app/Http/Models/User.php 主表指定表名
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'user';
}
- app/Http/Controller/DBController.php 两表的一对一关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\Jobs;
class DBController extends Controller
{
public function sql()
{
$db = Jobs::find(2)->user;
return $db;
}
}
2.5.7.2 模型的一对多关联
一对多关联,指主表的单个数据对应关联副表的多个数据
2.5.7.2.1 正向一对多关联
- app/Http/Models/Books.php 新建副表数据模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Books extends Model
{
protected $table = 'book';
}
- app/Http/Models/User.php 关联副表的模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function books(){
return $this->hasMany(Books::class,'user_id','id');
}
}
hasMany( 副表模型类名, 外键名, 主键名 )
- app/Http/Controller/DBController.php 两表的一对多关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::find(10)->books;
return $db;
}
}
2.5.7.2.2 反向一对多关联
- app/Http/Models/Books.php 新建副表的数据模型并关联主表
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Books extends Model
{
protected $table = 'book';
public function user(){
return $this->belongsTo(User::class,'user_id','id');
}
}
belongsTo( 主表模型类名, 外键名, 主键名 )
- app/Http/Models/User.php 主表指定表名
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'user';
}
- app/Http/Controller/DBController.php 两表的一对多关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\Books;
class DBController extends Controller
{
public function sql()
{
$db = Book::find(2)->user;
return $db;
}
}
2.5.7.3 模型的多对多关联
多对多关联,指主表的单个数据对应关联副表的多个数据,并且副表的单个数据对应关联主表的多个数据
2.5.7.3.1 正向多对多关联
- app/Http/Models/Role.php 新建副表数据模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $table = 'role';
}
- app/Http/Models/User.php 关联副表的模型
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function role(){
return $this->
belongsToMany(
Role::class,
'role_user',
'user_id',
'role_id'
);
}
}
belongsToMany
( 副表模型类名, 中间表名, 中间表中主表外键, 中间表中副表外键 )
- app/Http/Controller/DBController.php 两表的多对多关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\User;
class DBController extends Controller
{
public function sql()
{
$db = User::find(1)->role;
return $db;
}
}
2.5.7.3.2 反向多对多关联
- app/Http/Models/Role.php 新建副表的数据模型并关联主表
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $table = 'role';
public function user(){
return $this->
belongsToMany(
Role::class,
'role_user',
'role_id',
'user_id'
);
}
}
belongsToMany
( 副表模型类名, 中间表名, 中间表中副表外键, 中间表中主表外键 )
- app/Http/Models/User.php 主表指定表名
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'user';
}
- app/Http/Controller/DBController.php 两表的一对多关联查询
<?php
namespace App\Http\Controllers;
use App\Http\Models\Role;
class DBController extends Controller
{
public function sql()
{
$db = Role::find(2)->user;
return $db;
}
}
2.5.8 Eloquent ORM-关联查询
模型关联特有的查询方法
- has( ) 指定条件的查询关联模型的数据
// 获取关联爱好表中'一个用户至少1个爱好'的数据
$db = User::has('hobby')->get();
// 获取关联爱好表中'一个用户超过2个爱好'的数据
$db = User::has('hobby' '>' 2)->get();
- whereHas( ) 指定条件的回调函数查询关联模型的数据
$db = User::whereHas('hobby',function ($que){
$que -> where('user_id','=',10)
})->get();
- doesntHave( ) 指定条件的查询关联模型,获取排除该结果的所有数据
$db = User::doesntHave('hobby','<=' 1)-get();
- withCount( ) 给关联模型的表中的某个字段进行统计操作
$db = User::withCount(['hobby'])->get();
2.5.9 Eloquent ORM-模型的预加载
预加载应用在解决关联查询中产生的N+1次查询所导致的资源消耗。因此可采用with( ) 方法进行预加载设置,提前的将SQL查询进行整合
$db = Hobby::with('user')->get();
foreach($db as $hobby){
echo $hobby -> user -> uname;
}
2.5.10 Eloquent ORM-模型的关联写入
2.5.10.1 一对一/多关联写入
- save( ) 单个数据的模型关联写入
$db = User::find(10);
$db -> hobby() -> save(new Hobby(['hobby' => '高尔夫球']));
- create( ) 单个数据的模型关联写入
$db = User::find(10);
$db -> hobby() -> create('hobby' => '高尔夫球');
- saveMany( ) 多个数据的模型关联写入
$db = User::find(10);
$db -> hobby() -> saveMany([
new Hobby(['hobby' => '高尔夫球']),
new Hobby(['hobby' => '海钓'])
]);
- createMany( ) 多个数据的模型关联写入
$db = User::find(10);
$db -> hobby() -> createMany([
'hobby' => '高尔夫球',
'hobby' => '海钓'
]);
2.5.10.2 多对多关联写入
- attach( ) 单个数据的模型关联写入
// 不包含中间表操作应用场景
$db = User::find(10);
$db -> role() -> attach(2);
// 包含中间表写入操作应用场景
$db = User::find(10);
$db -> role() -> attach(2, ['role_desc' => '赋管理员权限']);
- attach( [数组] ) 多个数据的模型关联写入
// 不包含中间表写入操作应用场景
$db = User::find(10);
$db -> role() -> attach([1,2,3]);
// 包含中间表写入操作应用场景
$db -> role() -> attach([
1 => ['role_desc' => '赋超级管理员权限'],
2 => ['role_desc' => '赋管理员权限'],
3 => ['role_desc' => '赋普通成员权限']
]);
- sync( ) 多个数据的模型关联同步写入,确保唯一性数据写入,
// 不包含中间表写入操作应用场景
$db = User::find(10);
$db -> role() -> sync([1,2,3]);
// 包含中间表写入操作应用场景
$db -> role() -> sync([
1 => ['role_desc' => '赋超级管理员权限'],
2 => ['role_desc' => '赋管理员权限'],
3 => ['role_desc' => '赋普通成员权限']
]);
- detach( ) 单个数据的移除
$db = User::find(10);
$db -> role() -> detach(2);
2.6 Laravel中间件
中间件是当程序接受HTTP请求时,对其进行拦截进行过滤操作,中间件可分为前置中间件:先拦截请求再执行主体代码;后置中间件:先执行主体代码再拦截请求
- app/Http/Middleware/Check.php 创建中间件(前置/后置中间件创建其一)
- 前置中间件
<?php
namespace App\Http\Middleware;
use Closure;
class Check
{
public function handle($request, Closure $next)
{
if($request->get('lid') != 1){
return redirect('/loginfaild');
}
return $next($request);
}
}
- 后置中间件
<?php
namespace App\Http\Middleware;
use Closure;
class Check
{
public function handle($request, Closure $next)
{
$res = $next($request)
echo '后置中间件拦截!'
return $res;
}
}
Artisan命令创建控制器:
php artisan make:middleware Check
- app/Http/Kernel.php 将中间件进行注册
<?php
namespace App\Http;
use App\Http\Middleware\Check;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
...其他中间件注册
protected $routeMiddleware = [
'check' => Check::class,
'auth' =>
];
...其他组中间件注册
}
- app/Http/Controller/LoginController.php 创建登录控件器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
public function loginSuccess(){
echo '登录成功!';
}
public function loginFaild(){
echo '登录失败!';
}
}
- routes/web.php 设置路由和中间件
<?php
use App\Http\Controllers\TestController;
use Illuminate\Support\Facades\Route;
Route::get('/logins','LoginController@loginSuccess')
-> middleware('check') ;
Route::get('/logine','LoginController@loginFaild');
2.7 表单伪造与CSRF保护
前端的Form表单的提交方法默认只有GET与POST两种方式,可采用表单伪造对表单提交PUT、DELETE等方法的扩展;
CSRF保护是针对表单的POST提交方法的保护手段。
- routes/web.php 表单路由与获取表单路由创建
Route::get('/test/form','TestController@form');
Route::put('/test/getform',function (){
return 'Get From Success!';
});
- app/Http/Controllers TestController控制器
<?php
namespace App\Http\Controllers;
class TestController extends Controller
{
public function form(){
return view('form');
}
}
- resources/views 视图文件form.blade.php的创建
- 常规方式
<form action="/test/getform" method="post">
{{-- CSRF保护 --}}
<input type="hidden"
name="_token"
value="{{csrf_token()}}">
{{-- 表单伪造PUT方法 --}}
<input type="hidden"
name="_method"
value="put">
<button type="submit">提交</button>
</form>
- 简洁方式
<form action="/test/getform" method="post">
@csrf
@method('put')
<button type="submit">提交</button>
</form>
若想设置部分的路由不进行CSRF保护,可前往app/Http/Middleware/VerifyCsrfToken.php文件设置CSRF白名单