本文共 14286 字,大约阅读时间需要 47 分钟。
一、Laravel简介
框架提供的功能:
1、数据库DB 2、缓存Cache 3、会话Session 4、文件上传流行框架的优点
文档齐全 社区活跃 后期支持Laravel简介
1、简洁,优雅 2、验证,路由,session缓存,数据库迁移功能,单元测试版本选择
长期支持 LTS Long Time support二、环境配置
服务器环境
$ php -vPHP 7.1.23
Laravel 5.8 要求:PHP >= 7.1.3
文档:MVC数据交互
视图View <-> 控制器Controller <-> 模型Model
Mac MAMP
Win XAMPPphpinfo.php
设置国内镜像
# 查看全局设置composer config -gl# 设置镜像composer config -g repo.packagist composer https://mirrors.aliyun.com/composer# 解除镜像composer config -g --unset repos.packagist
参考
创建项目
$ composer create-project laravel/laravel=5.8.* demo --prefer-dist$ cd demo$ php artisan --versionLaravel Framework 5.8.35# 启动服务$ php artisan serve
访问:http://127.0.0.1:8000
整个文件夹大小
Laravel Framework 5.8.35 32.8M ThinkPHP_5.0.24_with_extend 5.6M三、路由
1、路由简介
路由将用户的请求转发给对应的程序进行处理 作用:建立url和程序之间的映射 请求类型:get、post、put、patch、delete 路由文件:routes/web.php2、基本路由
Route::get('hello', function () { return 'hello world';});Route::post('post', function () { return 'post';});
3、多请求路由
Route::match(['get', 'post'], 'match', function () { return 'match';});Route::any('any', function () { return 'any';});
4、路由参数
Route::get('detail/{id}', function ($id) { return 'detail-id: ' . $id ;});// 默认参数Route::get('detail/{name?}', function ($name = null) { return 'detail-name: ' . $name ;});// 正则判断参数类型Route::get('detail/{id}', function ($id) { return 'detail-id: ' . $id ;})->where('id', '\d+');Route::get('detail/{name?}', function ($name = null) { return 'detail-name: ' . $name ;})->where('name', '[A-Za-z]+');// 多个参数校验Route::get('detail/{id}/{name?}', function ($id, $name = null) { return 'detail-id: ' . $id . ' detail-name: ' . $name ;})->where(['id' => '\d+', 'name' => '[A-Za-z]+']);
5、路由别名
Route::get('path', ['as'=>'alias', function(){ return Route('alias');}]);
6、路由群组
Route::group(['prefix' => 'user'], function (){ // 访问方式:user/name Route::get('name', function (){ return 'user name'; }); // 访问方式:user/age Route::get('age', function (){ return 'user age'; });});
7、路由中输出视图
Route::get('/', function () { return view('welcome'); // resources/views/welcome.blade.php});
四、控制器
路由只接收请求,具体业务逻辑交由控制器处理
1、新建控制器
app/Http/Controllers/MemberController.phpnamespace App\Http\Controllers;class MemberController extends Controller{ function info(){ return 'hello world'; }}
2、控制器和路由关联
Route::get('member/info', 'MemberController@info');// 或者Route::get('member/info', ['uses' => 'MemberController@info']);
3、关联控制器后,路由特性使用
// 别名Route::get('member/info', [ 'uses' => 'MemberController@info', 'as' => 'memberinfo']);// 控制器中使用别名// Route('memberinfo');// 路由参数Route::get('member/info/{id}', 'MemberController@info');// 控制器接收参数// function info($id){ // return 'info:' . $id;// }// 验证路由参数Route::get('member/info/{id}', 'MemberController@info') ->where('id', '[0-9]+');
五、视图
一个控制器对应一个目录
1、新建视图
如果要输出变量,注意后缀为blade.php
resources/views/member/info.blade.php member info
name: { {$name}}age: { {$age}}
2、输出视图
路由配置Route::get('member/info', 'MemberController@info');
控制器方法
class MemberController extends Controller{ function info(){ $data = [ 'name' => 'Tom', 'age' => 18 ]; return view('member/info', $data); }}
六、模型
1、新建模型
app/Member.phpnamespace App;use Illuminate\Database\Eloquent\Model;class Member extends Model{ public static function getMember(){ return [ 'name' => 'Tom', 'age' => 18 ]; }}
2、使用模型
namespace App\Http\Controllers;use App\Member;class MemberController extends Controller{ function info(){ $data = Member::getMember(); return $data }}
七、数据库
Laravel提供3种操作数据库方式
1、DB facade 原始查找 2、查询构造器query builder 3、Eloquent ORM八、DB facade 原始查找
1、新建数据表与连接数据库
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名', `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄', `sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性别', `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表'
2、配置数据连接库参数
.envDB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=dataDB_USERNAME=rootDB_PASSWORD=123456
3、使用DB facade实现CURD
如果配置完数据库信息不生效,可以清理缓存重启服务php artisan cache:clearphp artisan config:clearphp artisan serve
CURD函数
static array select(string $query, array $bindings = [])static bool insert(string $query, array $bindings = [])static int update(string $query, array $bindings = [])static int delete(string $query, array $bindings = [])
完整示例
namespace App\Http\Controllers;use Illuminate\Support\Facades\DB;class StudentController extends Controller{ function list() { # 查询 $list = DB::select('select * from student'); // return $list; // json // var_dump($list); // Array dd($list); // 便于查看的Array } function insert() { // 插入 $bool = DB::insert('insert into student(name, age) values(?, ?)', ['小白', 23] ); var_dump($bool); // bool(true) } function update() { // 更新 $num = DB::update('update student set name = ? where id = ? ', ['大白', 1] ); var_dump($num); // int(1) } function delete() { // 删除 $num = DB::delete('delete from student where id = ?', [2] ); var_dump($num); // int(1) }}
九、查询构造器
Laravel查询构造器query builder
使用PDO参数绑定,SQL注入保护打印执行的SQL语句
# 安装$ composer require "eleven26/listen-sql:~1.0.4" --dev# 修改 bootstrap/app.php$app->register(Eleven26\ListenSql\ListenSqlServiceProvider::class);# 启动$ php artisan listen-sql:start
参考
1、新增数据
$data = [ 'name' => '小白', 'age' => 23];// 1、插入$bool = DB::table('student')->insert($data);// insert into `student` (`name`, `age`) values ("小白", 23)var_dump($bool);// bool(true)// 2、插入并获取自增id$id = DB::table('student')->insertGetId($data);// insert into `student` (`name`, `age`) values ("小白", 23)var_dump($id);// int(2)$list = [ ['name' => '小白', 'age' => 23], ['name' => '大白', 'age' => 24],];// 3、插入多条数据$bool = DB::table('student')->insert($list);// insert into `student` (`age`, `name`) values (23, "小白"), (24, "大白")var_dump($bool);// bool(true)
2、更新数据
// 1、更新, 注意要写where条件$num = DB::table('student') ->where('id', '=',1) ->update(['name' => '大黄']);// update `student` set `name` = "大黄" where `id` = 1var_dump($num);// int(1)// 2、自增,默认1$num = DB::table('student')->increment('age');// update `student` set `age` = `age` + 1var_dump($num);// int(8)// 3、自减,默认1$num = DB::table('student')->decrement('age');// update `student` set `age` = `age` - 1var_dump($num);// int(8)// 4、带条件自增$num = DB::table('student') ->where('id', 1) ->increment('age');// update `student` set `age` = `age` + 1 where `id` = 1var_dump($num);// int(1)// 5、自增额外修改其他字段$num = DB::table('student') ->where('id', 1) ->increment('age', 1, ['name' => '大白']);// update `student` set `age` = `age` + 1, `name` = "大白" where `id` = 1var_dump($num);// int(1)
3、删除数据
// 1、删除数据$num = DB::table('student') ->where('id', '=', 1) ->delete();// delete from `student` where `id` = 1var_dump($num);// int(1)// 2、清空数据, 危险 谨慎使用$num = DB::table('student')->truncate();// truncate `student`var_dump($num);// NULL
4、查询数据
// 1、get获取列表$list = DB::table('student')->get();// select * from `student`// 2、first获取一条数据$data = DB::table('student') ->orderBy('age', 'desc') ->first();// select * from `student` order by `age` desc limit 1// 3、where条件$data = DB::table('student') ->where('age', '>=', 24) ->get();// select * from `student` where `age` >= 24// 4、where多条件$data = DB::table('student') ->whereRaw('id > ? and age > ?', [1, 23]) ->get();// select * from `student` where id > 1 and age > 23// 5、返回键值对,第二个字段是key,第一个字段是value// 5.3版本弃用了lists,使用pluck$data = DB::table('student') ->pluck('name', 'id');// select `name`, `id` from `student`// 6、select 指定字段$data = DB::table('student') ->select('name', 'age') ->get();// select `name`, `age` from `student`// 7、chunk分段获取,必须加order排序DB::table('student') ->orderBy('id') ->chunk(2, function ($list) { echo $list; });// select * from `student` order by `id` asc limit 2 offset 0// select * from `student` order by `id` asc limit 2 offset 2// ...
5、聚合函数
count 计数 max 最大值 min 最小值 avg 平均值 sum 求和$count = DB::table('student')->count();// select count(*) as aggregate from `student`var_dump($count);// int(3)$count = DB::table('student')->min('age');// select min(`age`) as aggregate from `student`
十、Eloquent ORM
Active Record
每一张表都有一个与之对应的模型Model1、模型建立及查询数据
默认关联模型名称的复数表名 默认以id为主键// 1、全部数据Student::all();// select * from `student`// 2、根据主键id查找一条数据Student::find(1);// select * from `student` where `student`.`id` = 1 limit 1// 3、根据主键id查找一条数据,如果没有抛出异常Student::findOrFail(11);// select * from `student` where `student`.`id` = 1 limit 1// 4、获取列表Student::get();// select * from `student`// 5、获取一条数据Student::where('id', '>', 1) ->orderbyDesc('age') ->first();// select * from `student` where `id` > 1 order by `age` desc limit 1// 6、chunk分次获取Student::chunk(2, function ($data){ var_dump($data);});// select * from `student` order by `student`.`id` asc limit 2 offset 0// select * from `student` order by `student`.`id` asc limit 2 offset 2// ...// 7、聚合函数Student::count();// select count(*) as aggregate from `student`Student::where('id', '>=', 1) ->max('age');// select max(`age`) as aggregate from `student` where `id` >= 1
2、新增数据,自定义时间戳及批量赋值
(1)通过模型新增,涉及到自定义时间戳 默认维护时间字段created_at, updated_at[1]新增数据
# 取消自动维护时间字段,一般设置为truepublic $timestamps = false;# 自定义时间戳格式public function getDateFormat(){ return time();}
通过模型新增数据
$student = new Student();$student->name = '小孙';$student->age = 23;$bool = $student->save();// insert into `student` (`name`, `age`, `updated_at`, `created_at`) // values ("小孙", 23, "157459359, "1574593597")
[2]获取数据
获取数据的时候会自动格式化$student = Student::find(5);echo $student->created_at;// 2019-11-24 10:11:23
// 不自动格式化时间戳protected function asDateTime($value){ return $value;}// 自定义格式化date('Y-m-d H:i:s', $student->created_at);// 2019-11-24 10:11:23
时区设置
方法一:修改php.ini配置文件// 查看php.ini文件路径phpinfo()$ cp php.ini.default php.ini[Date]date.timezone = PRC// 或者// date.timezone = "Asia/Shanghai"// PRC是指中华人民共和国 (People's Republic of China)
方法二:临时修改
// 查看当前时区date_default_timezone_get();// 临时设置时区date_default_timezone_set('Asia/Shanghai');
参考
如果不生效需要修改Laravel配置
config/app.php// 'timezone' => 'UTC','timezone' => 'PRC',
(2)使用模型create方法新增数据,涉及批量赋值
// 指定允许批量赋值的字段protected $fillable = ['name', 'age'];// 指定不允许批量赋值的字段protected $guarded = [];
$data = [ 'name'=> '小红', 'age'=> 23];$student = Student::create($data);// insert into `student` (`name`, `age`, `updated_at`, `created_at`) // values ("小红", 23, "157459331, "1574593314")
查找或创建 firstOrCreate()
// 存在则获取$data = [ 'name'=> '小红', 'age'=> 23];$student = Student::firstOrCreate($data);// select * from `student` where (`name` = "小红" and `age` = 23) limit 1// 不存在则创建$data = [ 'name'=> '小红', 'age'=> 25];$student = Student::firstOrCreate($data);// select * from `student` where (`name` = "小红" and `age` = 25) limit 1// insert into `student` (`name`, `age`, `updated_at`, `created_at`) // values ("小红", 25, "157459366, "1574593662")
查找或创建实例,保存需要调用save
firstOrNew()3、修改数据
(1)模型更新$student = Student::find(4);// select * from `student` where `student`.`id` = 4 limit 1$student->name = '大白';$student->save();// update `student` // set `name` = "大白", `student`.`updated_at` = 1574594275 // where `id` = 4
(2)批量更新
Student::where('id', 1)->update(['name' => '大白']);// update `student` // set `name` = "大白", `student`.`updated_at` = 1574594465 // where `id` = 1
4、删除数据
(1)模型删除$student = Student::find(4);// select * from `student` where `student`.`id` = 4 limit 1$bool = $student->delete();// delete from `student` where `id` = 4
(2)主键删除
$num = Student::destroy(1);// select * from `student` where `id` in (1)// delete from `student` where `id` = 1$num = Student::destroy(1, 2, 3);// select * from `student` where `id` in (1, 2, 3)// delete from `student` where `id` = 2// delete from `student` where `id` = 3$num = Student::destroy([1, 2, 3]);// select * from `student` where `id` in (1, 2, 3)// delete from `student` where `id` = 1// delete from `student` where `id` = 2// delete from `student` where `id` = 3
(3)条件删除
$num = Student::where('id', '=', '1')->delete();// delete from `student` where `id` = "1"
十一、Blade模板引擎
Blade模板引擎可以使用PHP代码
编译完成后会被缓存1、模板继承
resources/views/student/layout.blade.php@yield('title', '标题')
@section('main') 主要内容 @show
resources/views/student/index.blade.php
@extends('student/layout')@section('title') 重写标题@stop@section('main') @parent 重写内容@stop
Controller返回模板
namespace App\Http\Controllers;class StudentController extends Controller{ function list() { $data = [ 'name' => 'Tom' ]; return view('student/index', $data); }}
编译结果
重写标题
主要内容重写内容
2、基础语法和include
// 1、模板中输出PHP变量{ { $name }}// 2、模板中调用PHP代码{ { time() }}{ { date('Y-m-d H:i:s', time()) }}{ { in_array($name, $arr) ? 'true' : 'false' }}{ { var_dump($arr) }}{ { isset($name) ? $name : 'default' }}{ { $name or 'default' }}// 3、原样输出@{ { @name }}// 4、注释{ { -- 这是模板注释,看不到 --}} // 5、引入子视图@include('student.common', ['key' => 'value'])
3、流程控制
// if控制@if($name == 'Tom') Tom@elseif($name == 'Jack') Jack@else else@endif// unless === not if@unless($name != 'Tom') Tom@endunless// for循环@for ($i=0; $i < 10; $i++) { { $i}}@endfor@foreach($students as $student) { { $student->name}}@endforeach// forelse 数组为空给默认值@forelse($students as $student) { { $student->name}}@empty null@endforelse
4、模板中的URL
url 路由名称生成 action 控制器和方法名生成 route 别名生成控制器设置
Route::get('student/list', ['as'=> 'list', 'uses'=> 'StudentController@list']);
三种方式结果一样
{ { url('student/list') }}{ { action('StudentController@list') }}{ { route('list') }}
http://localhost:8000/student/list
总结
安装Laravel
核心目录文件 路由 MVC 数据库操作3种 模板引擎转载地址:https://pengshiyu.blog.csdn.net/article/details/103230585 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!