本文共 20312 字,大约阅读时间需要 67 分钟。
常用PHP开发集成环境,选择其一者安装,安装与配置详见对应的官方网站文档
PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。当然也集成了Laravel框架依赖。
不同的操作系统对应不同的操作对应不同的安装方式,详细见官方文档
composer global require laravel/installer
命令行composer require barryvdh/laravel-debugbar
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
'enabled' => env('DEBUGBAR_ENABLED',true)
composer create-project --prefer-dist laravel/laravel blog
按照前端输入的URL进行不同的响应
Artisan命令创建控制器:
php artisan make:controller Home
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’ 类的方法
将设计好的路由赋予一个类似变量形式名称,采用name('路由名称')
方法,在路由跳转或应用于其他业务时,填写该路由名称可跳转至指定路由,其作用是采用路由名称的方式时方便对路由路径的修改,无论如何变化,路由名称不会改变。
Route::get('/test/url','TestController@url') ->name('test.url');
- 非官方约定命名方式:name(‘控制器名.方法名’)
- route( )为助手函数,用于获取路由生成的URL地址
路由分组是让多个路由共享路由属性
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');});
当用户由于失误,输入错误路由地址,页面跳转"Not Found 404"页面,这时可采取回退路由方式来挽回该错误操作
Route::fallback(function (){ return redirect('/');});
必须把回退路由放在所有路由的底层
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模式跳转根据设计的要求,定义一个只执行一个方法的控制器称为单行为控制器,使用__invoke()
方法进行创建。
Artisan命令创建控制器:
php artisan make:controller OnlyController --invokable
Route::get('/only','OnlyController');
服务器向客服端返回数据时可使用response()
来配置响应的格式
'Lucy','age'=>'18']; return response() ->json($arr); }}
'Lucy','age'=>'18']; return response($arr,201); }}
'Lucy','age'=>'18']; $html = 'Header
'; return response($html); }}
找到Wampserver安装目录下的MySQL文件的bin文件的路径,将其绝对路径赋值其系统环境的Path配置中,完成此操作后可方便通过编辑器的终端访问
...其他配置 DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=dessert // 数据库名DB_USERNAME=root // 用户名DB_PASSWORD=123456 // 密码...其他配置
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
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’ 的命名是具有相关规范
$db = DB::table('users');
$db = DB::table('users')->get();
$db = DB::table('users')->first();
$db = DB::table('users')->vaule('uname');
$db = DB::table('users')->find(5);
$db = DB::table('users')->pluck('uname');
$db = DB::table('users')->pluck('uname','uid');
chunk( ) 对于过多的数据方便读取,使用该方法对大量数据进行分块操作
DB::table('user')->orderBy('id')->chunk(3,function ($user){ foreach ($user as $item){ echo $item -> username; } });
$db = DB::table('user')->count();
$db = DB::table('user')->avg('wage');
$db = DB::table('user')->max('wage');
$db = DB::table('user')->min('wage');
$db = DB::table('user')->sum('wage');
$db = DB::table('user')->where('uname','Lucy')->exists();
$db = DB::table('user')->where('uname','Lucy')->doesntExist();
// 1.查询指定字段数据$db = DB::table('user')->select('uname','email')->get();// 2.字段名取别名$db = DB::table('user')->select('uname as name')->get();
$db = DB::table('user')->select('uname','email');$newdb = $db->addSelect('age')->get();
select()
方法中可实现原生表达式的查询规则$db = DB::table('user') ->select(DB::raw('COUNT(*) AS count, gender')) ->groupBy('gender') // 分组 ->get();
$db = DB::table('user') ->selectRaw('COUNT(*) AS count, gender') ->groupBy('gender') // 分组 ->get();
$db = DB::table('user') ->selectRaw('COUNT(*) AS count, gender') ->groupBy('gender') // 分组 ->havingRaw('count >3') ->get();
// '=' 操作符$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();
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();
$db = DB::table('user') ->whereBetween('age',[18, 25]) ->get();
- orWhereBetween( ) 区间内的or数据查询
- whereNotBetween( ) 非区间内的数据查询
- orWhereNotBetween( ) 非区间内的or数据查询
$db = DB::table('user') ->whereIn('id',[20, 25, 30]) ->get();
- orWhereIn( ) 数组指定数据or查询
- whereNotIn( ) 非数组指定数据查询
- orWhereNotIn( ) 非数组指定数据or查询
$db = DB::table('user') ->whereNull('id') ->get();
- whereNotNull( ) 非NULL的数据查询
- orWhereNotNull 非NULL的数据or查询
- orWhereNull( ) NULL数据的or查询
$db = DB::table('user') ->whereDate('created_at','2021-6-10') ->get();
- whereYear( ) 按照年份查询
- orWhereYear( ) 按照年份or查询
- whereMonth( ) 按照月份查询
- orWhereMonth( ) 按照月份or查询
- whereDay( ) 按照日查询
- orWhereDay( ) 按照日or查询
- whereTime( ) 按照时间查询
- orWhereTime( ) 按照时间or查询
$db = DB::table('user') ->whereColumn('created_at','updated_at') ->get();
asc
与倒序desc
排序操作$db = DB::table('user') ->orderBy('id','desc') ->get();
created_at
字段时间为准的倒序排序$db = DB::table('user') ->latest() ->get();
$db = DB::table('user') ->inRandomOrder() ->get();
$db = DB::table('user') ->skip(3) ->take(5) ->get();
$db = DB::table('user') ->offset(2) ->limit(3) ->get();
$db = DB::table('user') ->when(true, function ($que){ $que -> where('name', '=', 'Lucy'); }, function ($que) { $que -> where('name', '=', 'Tom'); } ) ->get();
子查询,又叫内部查询,当一个查询是另一个查询的条件时,称之为子查询。
$db = DB::table('user') ->whereExists(function ($que){ $que -> from('books') -> whereRaw('product.uid = users.id'); }) ->get()
$db = DB::table('user') ->join('jobs','jobs.uid','=', 'user.id') ->join('hobby','hobby.uid', '=', 'user.id') ->get();
$db = DB::table('user') ->leftjoin('jobs','jobs.uid','=', 'user.id') ->get();
$db = DB::table('user') ->rightjoin('hobby','hobby.uid', '=', 'user.id') ->get();
$db1 = DB::table('user') ->where('user.age', '>', 18 );$db2 = DB::table('user') ->where('user.sex', '=', '女') ->union($db1) ->get();
$db1 = DB::table('user') ->where('user.age', '>', 18 );$db2 = DB::table('user') ->where('user.sex', '=', '女') ->unionAll($db1) ->get();
// 新增一条数据$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' => '狗刨坑' ] );
$db = DB::table('user')->insertOrIgnore([ 'id' => 100, 'username' => '只狼', 'password' => '741852', 'email' => '741852@foxmail.com', 'details' => '武艺高强' ]);
$db = DB::table('user') ->insertGetId([ 'username' => '佛雕者', 'password' => '741852', 'email' => '666666@foxmail.com', 'details' => '隐市高手' ]);
$db = DB::table('user') ->where('id',100) ->update([ 'password' => '741852', 'details' => '武艺精湛' ]);
$db = DB::table('user') ->updateOrInsert( [ 'id' => 101 ], [ 'username' => '佛雕师', 'password' => '123456', 'details' => '前任修罗' ] );
$db = DB::table('user') ->where('id',100) ->increment('count');
$db = DB::table('user') ->where('id',100) ->decrement('count',5);
// 删除表中指定的一行数据$db = DB::table('user') ->where('id',101) ->delete(); // 清空表数据$db = DB::table('user') ->delete();
Laravel框架可使用Eloquent ORM关系对象模型,进行数据库交互
Artisan命令创建:
php artisan make:model Cake
name; return view('cakes',[ 'name' => $name, 'cakeData' => $cakeDate, ]); }}
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',...]
数据库字段白名单在查找数据编写了大量重复的相同查询语句,并该重复的查询语只运用于当前模型中,而不应用于其他的模型时,此时就可使用本地作用域的方式,将重复多次使用的查询语句进行封装
where('gender','男'); }}
本地作用域方法命名规则:scope + ‘语义名’
where('age', '>', 18 ) ->get(); return [$db]; }}
与本地作用域相对,在全局作用域中封装查询方法,可提供所用模型引用
where('age', '>', '18'); }}
访问器是运用在查询得到的数据,通过拦截数据进行修改的一系列行为
访问器方法命名规则:get + ‘字段名’ +Attribute
修改器是运用在把数据写入到数据库中时,通过拦截数据进行修改后再写入的一系列行为
attributes['uname'] = strtoupper($val); }}
'曼玉', 'sex' => '女', 'email' => 'manyu@foxmail.com', 'password' => '123456', ] ); return [$db]; }}
集合是一个更具读取性和处理能力的数组封装,数据的集合提供了大量的方法以便于开发者使用操作,其中数据库对象可返回数据集合也可开发者自己创建数据集合
// 使用collect()助手函数创建$collection = collect(['只狼','佛雕师','鬼刑部']);
map(function ($val, $key) { return "$key - $val"; }); }}
filter(function ($val, $key) { return $val === '只狼'; }); }}
reject(function ($val, $key) { return $val === '只狼'; }); }}
key
,否者返回false
search('义父'); }}
chunk(3); }}
each(function ($val){ echo $val; }); }}
all()); }}
avg(); }}
count(); }}
countBy(); }}
diff([10,40]); }}
duplicates(); }}
first(function ($val){ return $val >= 20; }); }}
14.flatten( ) 将多维数组转换为一维数组
flatten(); }}
key
值找到集合中的value
值'只狼', 'two' => '佛雕师' ]); return $col->get('one'); }}
key
,有则返回1无则返回空字符'只狼', 'two' => '佛雕师' ]); return $col->has('two'); }}
pop(); }}
slice(2); }}
- 集合方法多达百种,更多的方法参阅官方文档-综合话题-集合
- 以上是以创建的集合为示例,集合方法也可用在数据模型集合
模型关联是运用在两张及以上的表进行有规则性的绑定关联
一对一关联,指主表的单个数据对应关联副表的单个数据
hasOne(Jobs::class,'user_id','id'); }}
hasOne( 副表模型类名, 外键名, 主键名 )
jobs; return $db; }}
belongsTo(User::class,'user_id','id'); }}
belongsTo( 主表模型类名, 外键名, 主键名 )
user; return $db; }}
一对多关联,指主表的单个数据对应关联副表的多个数据
hasMany(Books::class,'user_id','id'); }}
hasMany( 副表模型类名, 外键名, 主键名 )
books; return $db; }}
belongsTo(User::class,'user_id','id'); }}
belongsTo( 主表模型类名, 外键名, 主键名 )
user; return $db; }}
多对多关联,指主表的单个数据对应关联副表的多个数据,并且副表的单个数据对应关联主表的多个数据
belongsToMany( Role::class, 'role_user', 'user_id', 'role_id' ); }}
belongsToMany
( 副表模型类名, 中间表名, 中间表中主表外键, 中间表中副表外键 )
role; return $db; }}
belongsToMany( Role::class, 'role_user', 'role_id', 'user_id' ); }}
belongsToMany
( 副表模型类名, 中间表名, 中间表中副表外键, 中间表中主表外键 )
user; return $db; }}
模型关联特有的查询方法
// 获取关联爱好表中'一个用户至少1个爱好'的数据$db = User::has('hobby')->get();// 获取关联爱好表中'一个用户超过2个爱好'的数据$db = User::has('hobby' '>' 2)->get();
$db = User::whereHas('hobby',function ($que){ $que -> where('user_id','=',10)})->get();
$db = User::doesntHave('hobby','<=' 1)-get();
$db = User::withCount(['hobby'])->get();
预加载应用在解决关联查询中产生的N+1次查询所导致的资源消耗。因此可采用with( ) 方法进行预加载设置,提前的将SQL查询进行整合
$db = Hobby::with('user')->get();foreach($db as $hobby){ echo $hobby -> user -> uname;}
$db = User::find(10);$db -> hobby() -> save(new Hobby(['hobby' => '高尔夫球']));
$db = User::find(10);$db -> hobby() -> create('hobby' => '高尔夫球');
$db = User::find(10);$db -> hobby() -> saveMany([ new Hobby(['hobby' => '高尔夫球']), new Hobby(['hobby' => '海钓'])]);
$db = User::find(10);$db -> hobby() -> createMany([ 'hobby' => '高尔夫球', 'hobby' => '海钓']);
// 不包含中间表操作应用场景$db = User::find(10);$db -> role() -> attach(2);// 包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> attach(2, ['role_desc' => '赋管理员权限']);
// 不包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> attach([1,2,3]);// 包含中间表写入操作应用场景$db -> role() -> attach([ 1 => ['role_desc' => '赋超级管理员权限'], 2 => ['role_desc' => '赋管理员权限'], 3 => ['role_desc' => '赋普通成员权限']]);
// 不包含中间表写入操作应用场景$db = User::find(10);$db -> role() -> sync([1,2,3]);// 包含中间表写入操作应用场景$db -> role() -> sync([ 1 => ['role_desc' => '赋超级管理员权限'], 2 => ['role_desc' => '赋管理员权限'], 3 => ['role_desc' => '赋普通成员权限']]);
$db = User::find(10);$db -> role() -> detach(2);
中间件是当程序接受HTTP请求时,对其进行拦截进行过滤操作,中间件可分为前置中间件:先拦截请求再执行主体代码;后置中间件:先执行主体代码再拦截请求
get('lid') != 1){ return redirect('/loginfaild'); } return $next($request); }}
Artisan命令创建控制器:
php artisan make:middleware Check
Check::class, 'auth' => ]; ...其他组中间件注册 }
middleware('check') ;Route::get('/logine','LoginController@loginFaild');
前端的Form表单的提交方法默认只有GET与POST两种方式,可采用表单伪造对表单提交PUT、DELETE等方法的扩展;
CSRF保护是针对表单的POST提交方法的保护手段。Route::get('/test/form','TestController@form');Route::put('/test/getform',function (){ return 'Get From Success!';});
若想设置部分的路由不进行CSRF保护,可前往app/Http/Middleware/VerifyCsrfToken.hpp文件设置CSRF白名单
转载地址:http://ezqgn.baihongyu.com/