博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01 Laravel-框架核心要点
阅读量:3933 次
发布时间:2019-05-23

本文共 20312 字,大约阅读时间需要 67 分钟。

文章目录

一、开发环境配置

1.1 PHP运行环境

常用PHP开发集成环境,选择其一者安装,安装与配置详见对应的官方网站文档

  1. XAMPP:集成 Apache + MariaDB + PHP + Perl
  2. WAMPSERVER:集成 Apache + MySQL + PHP

1.2 Composer依赖管理工具

PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。当然也集成了Laravel框架依赖。

不同的操作系统对应不同的操作对应不同的安装方式,详细见官方文档

1.2 Laravel 运行环境

  1. 通过上步安装的Composer依赖管理工具来安装Laravel全局运行环境,在命令窗口执行: composer global require laravel/installer命令行
  2. 配置Laravel的全局环境变量:
  • macOS: $HOME/.composer/vendor/bin
  • Windows: %USERPROFILE%\AppData\Roaming\Composer\vendor\bin

1.4 Debugbar调试工具

  1. 在终端输入以下命令行进行安装
composer require barryvdh/laravel-debugbar
  1. 向项目文件中新增debugbar调试工具的配置文件
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
  1. 调试工具的开关项在config/debugbar.php文件以下选项
'enabled' => env('DEBUGBAR_ENABLED',true)

二、核心要点

2.1 Laravel项目创建

composer create-project --prefer-dist laravel/laravel blog

2.2 Laravel路由

按照前端输入的URL进行不同的响应

  1. app/Http/Controllers 创建控制器

Artisan命令创建控制器:

php artisan make:controller Home

  1. routes/web.php 创建路由
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');});

代码说明:

  1. 常规路由标识:’/ ’
  2. 带参数路由标识:’/list/{ lid }’
  3. [Home::class,‘home’] :
    1. Home::class 指定控制器的类名
    2. ‘home’ 类的方法

2.2.1 路由命名

将设计好的路由赋予一个类似变量形式名称,采用name('路由名称')方法,在路由跳转或应用于其他业务时,填写该路由名称可跳转至指定路由,其作用是采用路由名称的方式时方便对路由路径的修改,无论如何变化,路由名称不会改变。

  1. routes/web.php 对路由进行命名
Route::get('/test/url','TestController@url')			 ->name('test.url');
  1. app/Http/Controllers TestController控制器
  1. 非官方约定命名方式:name(‘控制器名.方法名’)
  2. route( )为助手函数,用于获取路由生成的URL地址

2.2.2 路由分组

路由分组是让多个路由共享路由属性

  1. 空分组路由
Route::group([], function (){
Route::get('/test/http','TestController@http'); Route::get('/test/url','TestController@url');});
  1. 路径前缀路由分组
Route::prefix('api')->group(function (){
Route::get('/test/http','TestController@http'); Route::get('/test/url','TestController@url');});
  1. 中间件路由分组
Route::middleware('middle')->group(function (){
Route::get('/test/http','TestController@http'); Route::get('/test/url','TestController@url');});
  1. 子域名路由分组
Route::domain('localhost')->group(function (){
Route::get('/test/http','TestController@http'); Route::get('/test/url','TestController@url');});
  1. 命名空间路由分组
Route::namespace('User')->group(function (){
Route::get('/user','User@user');});
  1. 路由命名路由分组
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 路由重定向

  1. return redirect()->to('/index'); 常规跳转
  2. return redirect()->back('/index'); 路由返回跳转
  3. return redirect('/index'); 简写跳转
  4. return redirect()->route('Index.home'); 路由命名跳转
  5. return redirect()->action('UserController@user'); 跳至控制器
  6. return redirect()->away('http://www.baidu.com'); 跳至外部链接
  7. return Redirect::to('/index') Facade模式跳转

2.3 Laravel控制器

2.3.1 单行为控制器

根据设计的要求,定义一个只执行一个方法的控制器称为单行为控制器,使用__invoke()方法进行创建。

  1. app/Http/Controllers OnlyController控制器

Artisan命令创建控制器:

php artisan make:controller OnlyController --invokable

  1. routes/web.php 设计路由访问单一控制器
Route::get('/only','OnlyController');

2.3.2 响应配置

服务器向客服端返回数据时可使用response()来配置响应的格式

  1. 响应数据为JSON格式
'Lucy','age'=>'18']; return response() ->json($arr); }}
  1. 设置响应状态码
'Lucy','age'=>'18']; return response($arr,201); }}
  1. 设置响应头信息
'Lucy','age'=>'18']; $html = '

Header

'; return response($html); }}

2.4 Laravel数据库

  1. Wampserver集成环境的MySQL环境配置

找到Wampserver安装目录下的MySQL文件的bin文件的路径,将其绝对路径赋值其系统环境的Path配置中,完成此操作后可方便通过编辑器的终端访问

  1. .env 设置配置内容
...其他配置  DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=dessert // 数据库名DB_USERNAME=root // 用户名DB_PASSWORD=123456 // 密码...其他配置
  1. database/migrations 创建数据迁移文件
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

  1. 将数据迁移中的数据同步到数据库中
php artisan migration
  1. 向已创建的数据迁移的表中添加新字段,并同步数据库
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 查询构造器-查询方法

  1. table( ) 指定需要操作的表
$db = DB::table('users');
  1. get( ) 获取指定表的所有数据
$db = DB::table('users')->get();
  1. first( ) 查询指定表的第一条数据
$db = DB::table('users')->first();
  1. value( ‘value’ ) 获取指定表的第一条数据的指定字段名对应的值
$db = DB::table('users')->vaule('uname');
  1. find( id ) 获取指定表的对应id的一条数据
$db = DB::table('users')->find(5);
  1. 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 查询构造器-聚合方法

  1. count( ) 获取指定表的数据总数
$db = DB::table('user')->count();
  1. avg( ‘value’ ) 获取指定表的符合字段名的所有数据平均值
$db = DB::table('user')->avg('wage');
  1. max( ‘value’ ) 获取指定表的符合字段名的数据最大值
$db = DB::table('user')->max('wage');
  1. min( ‘value’ ) 获取指定表的符合字段名的数据最小值
$db = DB::table('user')->min('wage');
  1. sum( ‘value’ ) 获取指定表的符合字段名的所有数据总和
$db = DB::table('user')->sum('wage');
  1. exists( ) 获取指定表的查询的记录是否存在,返回布尔值
$db = DB::table('user')->where('uname','Lucy')->exists();
  1. doesntExist( ) 获取指定表的查询的记录是否存在,返回取反的布尔值
$db = DB::table('user')->where('uname','Lucy')->doesntExist();

2.4.4 查询构造器-select与where

2.4.4.1 select查询
  1. select( ) 查询指定字段的列数据和给字段名取别名
// 1.查询指定字段数据$db = DB::table('user')->select('uname','email')->get();// 2.字段名取别名$db = DB::table('user')->select('uname as name')->get();
  1. addSelect( ) 在已有的构建器表达式上增加查询规则
$db = DB::table('user')->select('uname','email');$newdb = $db->addSelect('age')->get();
  1. DB::raw( ) 写入select()方法中可实现原生表达式的查询规则
$db = DB::table('user')          ->select(DB::raw('COUNT(*) AS count, gender'))  				->groupBy('gender') // 分组          ->get();
  1. selectRaw( ) 直接使用该方法实现原生表达式的查询规则
$db = DB::table('user')          ->selectRaw('COUNT(*) AS count, gender')  				->groupBy('gender') // 分组          ->get();
  1. havingRaw( ) 对于查询的结果进行精准筛选分组
$db = DB::table('user')          ->selectRaw('COUNT(*) AS count, gender')  				->groupBy('gender') // 分组  				->havingRaw('count >3')          ->get();
2.4.4.2 where查询
  1. 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();
  1. 当有多个查询条件时,可使用数组形式
$db = DB::table('user')      ->where([        ['age', '>=' ,'20',],        ['sex', '=' , '女']      ])      ->get();
  1. orWhere( ) 可通过连缀方式实现两个及两个以上的or条件查询
$db = DB::table('user')      ->where('age', '>=' ,'25')      ->orWhere('sex', '=' , '女')      ->get();
  1. 闭包形式的复杂or条件查询
$db = DB::table('user')      ->where('age', '>=' ,'25')      ->orWhere(function ($or) {
$or -> where('sex','=','女') -> where('name', 'like','%敏%'); }) ->get();
  1. whereBetween( ) 可进行区间内的数据查询
$db = DB::table('user')      ->whereBetween('age',[18, 25])      ->get();
  1. orWhereBetween( ) 区间内的or数据查询
  2. whereNotBetween( ) 非区间内的数据查询
  3. orWhereNotBetween( ) 非区间内的or数据查询
  1. whereIn( ) 可实现匹配数组中指定数据的查询
$db = DB::table('user')      ->whereIn('id',[20, 25, 30])      ->get();
  1. orWhereIn( ) 数组指定数据or查询
  2. whereNotIn( ) 非数组指定数据查询
  3. orWhereNotIn( ) 非数组指定数据or查询
  1. whereNull 可查询值为NULL的数据
$db = DB::table('user')      ->whereNull('id')      ->get();
  1. whereNotNull( ) 非NULL的数据查询
  2. orWhereNotNull 非NULL的数据or查询
  3. orWhereNull( ) NULL数据的or查询
  1. whereDate( ) 可按照日期进行数据查询
$db = DB::table('user')      ->whereDate('created_at','2021-6-10')      ->get();
  1. whereYear( ) 按照年份查询
  2. orWhereYear( ) 按照年份or查询
  3. whereMonth( ) 按照月份查询
  4. orWhereMonth( ) 按照月份or查询
  5. whereDay( ) 按照日查询
  6. orWhereDay( ) 按照日or查询
  7. whereTime( ) 按照时间查询
  8. orWhereTime( ) 按照时间or查询

2.4.5 查询构造器-排序分组

  1. whereColumn( ) 实现两个字段相等的查询
$db = DB::table('user')      ->whereColumn('created_at','updated_at')      ->get();
  1. orderBy( ) 实现正序asc与倒序desc排序操作
$db = DB::table('user')      ->orderBy('id','desc')      ->get();
  1. latest( ) 实现以默认created_at字段时间为准的倒序排序
$db = DB::table('user')      ->latest()      ->get();
  1. inRandomOrder( ) 随机排序
$db = DB::table('user')      ->inRandomOrder()      ->get();
  1. **skip( )**输出位置 与 **take( )**输出条数,限制结果集的输出方式一
$db = DB::table('user')      ->skip(3)      ->take(5)      ->get();
  1. **offset( )**输出位置 与 **limit( )**输出条数,限制结果集的输出方式二
$db = DB::table('user')      ->offset(2)      ->limit(3)      ->get();
  1. 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查询

  1. join( ) 查询出两个表的交集
$db = DB::table('user')      ->join('jobs','jobs.uid','=', 'user.id')      ->join('hobby','hobby.uid', '=', 'user.id')      ->get();
  1. leftjoin( ) 查询出两个表的交集,外加左表剩下的数据
$db = DB::table('user')      ->leftjoin('jobs','jobs.uid','=', 'user.id')      ->get();
  1. rightjoin( ) 查询出两个表的交集,外加右表剩下的数据
$db = DB::table('user')      ->rightjoin('hobby','hobby.uid', '=', 'user.id')      ->get();
  1. union( ) 实现两个查询的取消重复合并操作
$db1 = DB::table('user')        ->where('user.age', '>', 18  );$db2 = DB::table('user')        ->where('user.sex', '=', '女')  		  ->union($db1)        ->get();
  1. 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 增加操作
  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' => '狗刨坑'    		] 			);
  1. insertOrIgnore( ) 新增数据时忽略重复插入数据的错误
$db = DB::table('user')->insertOrIgnore([      'id' => 100,      'username' => '只狼',      'password' => '741852',      'email' => '741852@foxmail.com',      'details' => '武艺高强'   ]);
  1. insertGetId( ) 获取的表中添加数据后自增的id
$db = DB::table('user')      ->insertGetId([          'username' => '佛雕者',          'password' => '741852',          'email' => '666666@foxmail.com',          'details' => '隐市高手'      ]);
2.4.8.2 更新操作
  1. update( ) 更新表中已存数据内容
$db = DB::table('user')      ->where('id',100)      ->update([          'password' => '741852',          'details' => '武艺精湛'      ]);
  1. updateOrInsert( ) 表中存在数据则更新,不存在则新增
$db = DB::table('user')      ->updateOrInsert(          [              'id' => 101          ],          [              'username' => '佛雕师',              'password' => '123456',              'details' => '前任修罗'          ]      );
  1. increment( ) 针对某字段数据加载表时自增指定值,默认自增1
$db = DB::table('user')      ->where('id',100)      ->increment('count');
  1. 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-创建模型

  1. app/Models 创建和数据库交互相关的Model文件

Artisan命令创建:

php artisan make:model Cake

  1. 相关控制器引入该Model文件,可对数据的表进行操作
name; return view('cakes',[ 'name' => $name, 'cakeData' => $cakeDate, ]); }}

2.5.2 Eloquent ORM-默认配置

  1. protected $table = 'table'; 指定对应的数据库表名
  2. protected $primaryKey = 'uid'; 修改默认的主键
  3. public $incrementing = false; 取消int类型的主键默认自增功能
  4. protected $keyType = 'string'; 取消主键默认功能需重设string类型
  5. public $timestamps = false; 取消created_at与updated_at字段的更新
  6. const CREATED_AT = 'c_time'; 修改created_at字段名
  7. const UPDATEd_AT = 'u_time'; 修改updated_at字段名
  8. protected $dateFormat = 'U'; 自定义时间戳格式
  9. protected $connection = 'mysql2'; 局部的更改数据库连接
  10. protected $fillable = ['name','email',...] 数据库字段白名单

2.5.3 Eloquent ORM-作用域

2.5.3.1 本地作用域

在查找数据编写了大量重复的相同查询语句,并该重复的查询语只运用于当前模型中,而不应用于其他的模型时,此时就可使用本地作用域的方式,将重复多次使用的查询语句进行封装

  1. app/Models/User.php 本地作用域查询语句的封装
where('gender','男'); }}

本地作用域方法命名规则:scope + ‘语义名’

  1. app/Http/Controllers/DBController.php 引用本地作用域封的装查询语句
where('age', '>', 18 ) ->get(); return [$db]; }}
2.5.3.2 全局作用域

与本地作用域相对,在全局作用域中封装查询方法,可提供所用模型引用

  1. app/Scopes/ageScope.php 全局作用域查询语句的封装
where('age', '>', '18'); }}
  1. app/Http/Model/User.php 开启全局作用域
  1. app/Http/Controllers/DBController.php 引用全局作用域封的装查询语句

2.5.4 Eloquent ORM-访问器

访问器是运用在查询得到的数据,通过拦截数据进行修改的一系列行为

访问器方法命名规则:get + ‘字段名’ +Attribute

2.5.5 Eloquent ORM-修改器

修改器是运用在把数据写入到数据库中时,通过拦截数据进行修改后再写入的一系列行为

  1. app/Http/Models/User.php 创建修改器
attributes['uname'] = strtoupper($val); }}
  1. app/Http/Controllers/DBController.php 向数据库新增数据
'曼玉', '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 常用集合方法
  1. map( ) 遍历集合数据,对数据进行批次修改
map(function ($val, $key) {
return "$key - $val"; }); }}
  1. filter( ) 筛选判断值为true的对应值,并输出该值
filter(function ($val, $key) {
return $val === '只狼'; }); }}
  1. reject( ) 筛选判断值为true的对应值,并输出除了该值的其他值
reject(function ($val, $key) {
return $val === '只狼'; }); }}
  1. search( ) 搜索集合的指定值,找到后返回该值的key,否者返回false
search('义父'); }}
  1. chunk( ) 对集合进行指定值的分割
chunk(3); }}
  1. each( ) 迭代输出集合值
each(function ($val){
echo $val; }); }}
  1. all( ) 转换为数组的形式输出
all()); }}
  1. avg( ) 计算集合值的平均值
avg(); }}
  1. count( ) 返回集合总数
count(); }}
  1. countBy( ) 返回集合中数值出现的次数或回调函数指定值的出现次数
countBy(); }}
  1. diff( ) 返回两个集合中的不同的值
diff([10,40]); }}
  1. duplicates( ) 返回集合中的重复值
duplicates(); }}
  1. first( ) 返回判断值为true的所有值中的第一个值
first(function ($val){
return $val >= 20; }); }}

14.flatten( ) 将多维数组转换为一维数组

flatten(); }}
  1. get( ) 通过key值找到集合中的value
'只狼', 'two' => '佛雕师' ]); return $col->get('one'); }}
  1. has( ) 判断集合中是否存在指定key,有则返回1无则返回空字符
'只狼', 'two' => '佛雕师' ]); return $col->has('two'); }}
  1. pop( ) 移出集合中的最后一个值,并返回该被移除的值
pop(); }}
  1. slice( ) 返回指定值后续的集合值
slice(2); }}
  • 集合方法多达百种,更多的方法参阅官方文档-综合话题-集合
  • 以上是以创建的集合为示例,集合方法也可用在数据模型集合

2.5.7 Eloquent ORM-模型关联

模型关联是运用在两张及以上的表进行有规则性的绑定关联

2.5.7.1 模型的一对一关联

一对一关联,指主表的单个数据对应关联副表的单个数据

2.5.7.1.1 正向一对一关联
  1. app/Http/Models/Jobs.php 新建副表数据模型
  1. app/Http/Models/User.php 关联副表的模型
hasOne(Jobs::class,'user_id','id'); }}

hasOne( 副表模型类名, 外键名, 主键名 )

  1. app/Http/Controller/DBController.php 两表的一对一关联查询
jobs; return $db; }}
2.5.7.1.2 反向一对一关联
  1. app/Http/Models/Jobs.php 新建副表的数据模型并关联主表
belongsTo(User::class,'user_id','id'); }}

belongsTo( 主表模型类名, 外键名, 主键名 )

  1. app/Http/Models/User.php 主表指定表名
  1. app/Http/Controller/DBController.php 两表的一对一关联查询
user; return $db; }}
2.5.7.2 模型的一对多关联

一对多关联,指主表的单个数据对应关联副表的多个数据

2.5.7.2.1 正向一对多关联
  1. app/Http/Models/Books.php 新建副表数据模型
  1. app/Http/Models/User.php 关联副表的模型
hasMany(Books::class,'user_id','id'); }}

hasMany( 副表模型类名, 外键名, 主键名 )

  1. app/Http/Controller/DBController.php 两表的一对多关联查询
books; return $db; }}
2.5.7.2.2 反向一对多关联
  1. app/Http/Models/Books.php 新建副表的数据模型并关联主表
belongsTo(User::class,'user_id','id'); }}

belongsTo( 主表模型类名, 外键名, 主键名 )

  1. app/Http/Models/User.php 主表指定表名
  1. app/Http/Controller/DBController.php 两表的一对多关联查询
user; return $db; }}
2.5.7.3 模型的多对多关联

多对多关联,指主表的单个数据对应关联副表的多个数据,并且副表的单个数据对应关联主表的多个数据

2.5.7.3.1 正向多对多关联
  1. app/Http/Models/Role.php 新建副表数据模型
  1. app/Http/Models/User.php 关联副表的模型
belongsToMany( Role::class, 'role_user', 'user_id', 'role_id' ); }}

belongsToMany

( 副表模型类名, 中间表名, 中间表中主表外键, 中间表中副表外键 )

  1. app/Http/Controller/DBController.php 两表的多对多关联查询
role; return $db; }}
2.5.7.3.2 反向多对多关联
  1. app/Http/Models/Role.php 新建副表的数据模型并关联主表
belongsToMany( Role::class, 'role_user', 'role_id', 'user_id' ); }}

belongsToMany

( 副表模型类名, 中间表名, 中间表中副表外键, 中间表中主表外键 )

  1. app/Http/Models/User.php 主表指定表名
  1. app/Http/Controller/DBController.php 两表的一对多关联查询
user; return $db; }}

2.5.8 Eloquent ORM-关联查询

模型关联特有的查询方法

  1. has( ) 指定条件的查询关联模型的数据
// 获取关联爱好表中'一个用户至少1个爱好'的数据$db = User::has('hobby')->get();// 获取关联爱好表中'一个用户超过2个爱好'的数据$db = User::has('hobby' '>' 2)->get();
  1. whereHas( ) 指定条件的回调函数查询关联模型的数据
$db = User::whereHas('hobby',function ($que){
$que -> where('user_id','=',10)})->get();
  1. doesntHave( ) 指定条件的查询关联模型,获取排除该结果的所有数据
$db = User::doesntHave('hobby','<=' 1)-get();
  1. 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 一对一/多关联写入
  1. save( ) 单个数据的模型关联写入
$db = User::find(10);$db -> hobby() -> save(new Hobby(['hobby' => '高尔夫球']));
  1. create( ) 单个数据的模型关联写入
$db = User::find(10);$db -> hobby() -> create('hobby' => '高尔夫球');
  1. saveMany( ) 多个数据的模型关联写入
$db = User::find(10);$db -> hobby() -> saveMany([  new Hobby(['hobby' => '高尔夫球']),  new Hobby(['hobby' => '海钓'])]);
  1. createMany( ) 多个数据的模型关联写入
$db = User::find(10);$db -> hobby() -> createMany([  'hobby' => '高尔夫球',  'hobby' => '海钓']);
2.5.10.2 多对多关联写入
  1. attach( ) 单个数据的模型关联写入
// 不包含中间表操作应用场景$db = User::find(10);$db -> role() -> attach(2);// 包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> attach(2, ['role_desc' => '赋管理员权限']);
  1. attach( [数组] ) 多个数据的模型关联写入
// 不包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> attach([1,2,3]);// 包含中间表写入操作应用场景$db -> role() -> attach([  1 => ['role_desc' => '赋超级管理员权限'],  2 => ['role_desc' => '赋管理员权限'],  3 => ['role_desc' => '赋普通成员权限']]);
  1. sync( ) 多个数据的模型关联同步写入,确保唯一性数据写入,
// 不包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> sync([1,2,3]);// 包含中间表写入操作应用场景$db -> role() -> sync([  1 => ['role_desc' => '赋超级管理员权限'],  2 => ['role_desc' => '赋管理员权限'],  3 => ['role_desc' => '赋普通成员权限']]);
  1. detach( ) 单个数据的移除
$db = User::find(10);$db -> role() -> detach(2);

2.6 Laravel中间件

中间件是当程序接受HTTP请求时,对其进行拦截进行过滤操作,中间件可分为前置中间件:先拦截请求再执行主体代码;后置中间件:先执行主体代码再拦截请求

  1. app/Http/Middleware/Check.php 创建中间件(前置/后置中间件创建其一)
  • 前置中间件
get('lid') != 1){
return redirect('/loginfaild'); } return $next($request); }}
  • 后置中间件

Artisan命令创建控制器:

php artisan make:middleware Check

  1. app/Http/Kernel.php 将中间件进行注册
Check::class, 'auth' => ]; ...其他组中间件注册 }
  1. app/Http/Controller/LoginController.php 创建登录控件器
  1. routes/web.php 设置路由和中间件
middleware('check') ;Route::get('/logine','LoginController@loginFaild');

2.7 表单伪造与CSRF保护

前端的Form表单的提交方法默认只有GET与POST两种方式,可采用表单伪造对表单提交PUT、DELETE等方法的扩展;

CSRF保护是针对表单的POST提交方法的保护手段。

  1. routes/web.php 表单路由与获取表单路由创建
Route::get('/test/form','TestController@form');Route::put('/test/getform',function (){
return 'Get From Success!';});
  1. app/Http/Controllers TestController控制器
  1. resources/views 视图文件form.blade.php的创建
  • 常规方式
{
{-- CSRF保护 --}}
{
{-- 表单伪造PUT方法 --}}
  • 简洁方式
@csrf @method('put')

若想设置部分的路由不进行CSRF保护,可前往app/Http/Middleware/VerifyCsrfToken.hpp文件设置CSRF白名单

转载地址:http://ezqgn.baihongyu.com/

你可能感兴趣的文章
[统计学笔记] (十三)指数分析(2)
查看>>
Data Science 到底是什么?
查看>>
机器学习(Machine Learning)和传统的数据统计分析(Data Statistics)有什么区别?
查看>>
统计学、统计学习和统计推断之间的关系
查看>>
PMP笔记:质量管理的七个工具
查看>>
CEO的苦恼:内部提拔还是“空降”?
查看>>
悦读:重新定义公司-谷歌是如何运营的
查看>>
研发主管的烦恼:周一早晨延迟的项目会议
查看>>
研发主管的烦恼:难以执行的绩效考核
查看>>
精益Scrum(五)
查看>>
精益Scrum(六)
查看>>
精益Scrum(七)
查看>>
软件测试管理—如何写好软件测试计划书
查看>>
解读一名软件测试经理所需要具备的能力
查看>>
有效的软件测试度量
查看>>
软件评测和测试国家现行标准
查看>>
理解测试策略
查看>>
机器学习界大牛林达华推荐的书籍
查看>>
谈一下ACM的入门书籍及方法
查看>>
surf中,颜色描述第四维
查看>>