01 Laravel-框架核心要点

文章目录

一、开发环境配置

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 创建控制器
<?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

  1. 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');
});

代码说明:

  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控制器
<?php

namespace App\Http\Controllers;

class TestController extends Controller
{
    public function url() {
        $url = route('test.url'); // 获取URL地址的助手函数
        return $url;
    }
}

  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控制器
<?php

namespace App\Http\Controllers;

class OnlyController extends Controller
{
    public function __invoke()
    {
        return 'Only';
    }
}

Artisan命令创建控制器:
php artisan make:controller OnlyController --invokable

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

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

  1. 响应数据为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);
    }
}

  1. 设置响应状态码
<?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);
    }
}
  1. 设置响应头信息
<?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数据库

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

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

  1. .env 设置配置内容
...其他配置
  
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dessert // 数据库名
DB_USERNAME=root // 用户名
DB_PASSWORD=123456 // 密码

...其他配置
  1. 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

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

  1. 相关控制器引入该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-默认配置
  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 本地作用域查询语句的封装
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function scopeSex($que, $val){
        $que -> where('gender','男');
    }
}

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

  1. 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 全局作用域

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

  1. 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');
    }
}

  1. 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());
    }
}

  1. 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-修改器

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

  1. 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);
		}
}
  1. 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 常用集合方法
  1. map( ) 遍历集合数据,对数据进行批次修改
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> map(function ($val, $key) {
            return "$key - $val";
        });
    }
}
  1. filter( ) 筛选判断值为true的对应值,并输出该值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> filter(function ($val, $key) {
            return $val === '只狼';
        });
    }
}
  1. reject( ) 筛选判断值为true的对应值,并输出除了该值的其他值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> reject(function ($val, $key) {
            return $val === '只狼';
        });
    }
}
  1. search( ) 搜索集合的指定值,找到后返回该值的key,否者返回false
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> search('义父');
    }
}
  1. chunk( ) 对集合进行指定值的分割
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> chunk(3);
    }
}
  1. each( ) 迭代输出集合值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(['只狼','佛雕师','鬼刑部','义父']);

        return $col -> each(function ($val){
            echo $val;
        });
    }
}

  1. all( ) 转换为数组的形式输出
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
    		$col = collect(['只狼','佛雕师','鬼刑部','义父']);

       	dd($col->all());
    }
}

  1. avg( ) 计算集合值的平均值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,30,40]);

        return $col->avg();
    }
}
  1. count( ) 返回集合总数
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,30,40]);

        return $col->count();
    }
}
  1. countBy( ) 返回集合中数值出现的次数或回调函数指定值的出现次数
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,30,40]);

        return $col->countBy();
    }
}
  1. diff( ) 返回两个集合中的不同的值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,30,40]);

        return $col->diff([10,40]);
    }
}
  1. duplicates( ) 返回集合中的重复值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,20,30,40,40]);

        return $col->duplicates();
    }
}
  1. 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();
    }
}
  1. get( ) 通过key值找到集合中的value
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(
          [
            'one' => '只狼', 
            'two' => '佛雕师'
          ]);

        return $col->get('one');
    }
}

  1. has( ) 判断集合中是否存在指定key,有则返回1无则返回空字符
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect(
          [
          	'one' => '只狼',
            'two' => '佛雕师'
          ]);

        return $col->has('two');
    }
}
  1. pop( ) 移出集合中的最后一个值,并返回该被移除的值
<?php

namespace App\Http\Controllers;

class DBController extends Controller
{
    public function sql()
    {
        $col = collect([10,20,30,40]);

        return $col->pop();
    }
}
  1. 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 正向一对一关联
  1. app/Http/Models/Jobs.php 新建副表数据模型
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Jobs extends Model
{
    protected $table = 'job';
}
  1. 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( 副表模型类名, 外键名, 主键名 )

  1. 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 反向一对一关联
  1. 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( 主表模型类名, 外键名, 主键名 )

  1. app/Http/Models/User.php 主表指定表名
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'user';
}
  1. 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 正向一对多关联
  1. app/Http/Models/Books.php 新建副表数据模型
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Books extends Model
{
    protected $table = 'book';
}
  1. 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( 副表模型类名, 外键名, 主键名 )

  1. 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 反向一对多关联
  1. 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( 主表模型类名, 外键名, 主键名 )

  1. app/Http/Models/User.php 主表指定表名
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'user';
}
  1. 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 正向多对多关联
  1. app/Http/Models/Role.php 新建副表数据模型
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    protected $table = 'role';
}
  1. 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
( 副表模型类名, 中间表名, 中间表中主表外键, 中间表中副表外键 )

  1. 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 反向多对多关联
  1. 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
( 副表模型类名, 中间表名, 中间表中副表外键, 中间表中主表外键 )

  1. app/Http/Models/User.php 主表指定表名
<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'user';
}
  1. 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-关联查询

模型关联特有的查询方法

  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 创建中间件(前置/后置中间件创建其一)
  • 前置中间件
<?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

  1. 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' => 
    ];

  ...其他组中间件注册
  
}

  1. 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 '登录失败!';
    }
}

  1. 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提交方法的保护手段。

  1. routes/web.php 表单路由与获取表单路由创建
Route::get('/test/form','TestController@form');

Route::put('/test/getform',function (){
    return 'Get From Success!';
});
  1. app/Http/Controllers TestController控制器
<?php

namespace App\Http\Controllers;

class TestController extends Controller
{ 
    public function form(){
        return view('form');
    }
}
  1. 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白名单

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值