laravel 目录结构
|- app
- http
- Controllers // 控制器目录
|- bootstrap // 启动配置文件 的目录
|- config // 所有的配置文件
|- database // 数据库迁移 与数据填充文件
|- public // 入口 和 网站的静态资源
|- resources // 包含了视图的原始资源文件 视图
|- srorage // 编译后的模板文件 和其他缓存文件
|- tests // 单元测试 目录 (单元测试代码)
|- vendor // 加载的依赖模块
- Controllers // 控制器目录
- laravel
- framework // 框架核心代码 目录
laravel 路由
基本路由
// 该路由直接收 get请求
Route::get('basic1', function () {
return 'hello world!';
});
// 该路由直接收 post请求
Route::post('basic2', function(){
return 'basic2';
});
多请求路由
// match 接受指定的 请求类型
Route::match(['get','post'], 'multy1',function(){
return 'multy1';
});
// any 相应所有框架支持的类型
Route::any('multy2', function(){
return 'multy2';
});
路由参数
// 基础的
//
// ---------
//
// Route::get('user/{id}', function($id){
// return 'User-id-'.$id;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/1
// 输出 User-id-1
//
// 如果访问地址中不带 userID参数值的话则 报错
// 即地址:
// http://laravel.study.com/user
// 可有可无的参数
//
// ---------
//
// Route::get('user/{name?}',function($name = null){
// return 'User-name-'.$name;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/test
// 输出 User-name-test
//
// 如果访问地址中不带 name参数值的话 则改值为空
// 即地址:
// http://laravel.study.com/user
// 输出 User-name-
// 设置参数默认值
// ---------
//
// Route::get('user/{sex?}',function($sex = 'man'){
// return 'User-sex-'.$sex;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/woman
// 输出 User-sex-woman
//
// 如果访问地址中不带 sex参数值的话 则默认值为 man
// 即地址:
// http://laravel.study.com/user
// 输出 User-sex-man
//
// 校验 路由参数
// Route::get('user/{name?}', function($name = 'test'){
// return 'User-name-'.$name;
// // 后面跟上where 条件 其中第二个值是正则表达式
// })->where('name', '[A-Za-z]+');
// 测试
// http://laravel.study.com/user
//
// 输出
// User-name-test
//
// -------
//
// 测试
// http://laravel.study.com/user/zhangsan
//
// 输出
// User-name-zhangsan
//
// -------
//
// 测试
// http://laravel.study.com/user/123
//
// 报错
// 不符合路由规则
// // 校验 多个字段
// Route::get('user/{id}/{name?}', function($id, $name = 'test'){
// return 'User-id-'.$id.'-name-'.$name;
// // 如果需要校验多个字段的 那么就用数组传参
// // ID 是数字 name 只能是大小写字母
// })->where(['id'=>'[0-9]+', 'name'=>'[A-Za-z]+']);
路由别名
// 路由别名的主要作用是 在使用 route函数 创建路由地址时,
// 可以使用路由别名创建,别名最好 字符少且能表达路由名称 这样好记也好写。
// // Route::get('user/member-center', ['as'=> 'center', function(){
// Route::get('user/center', ['as'=> 'center', function(){
// // 使用 route 函数 创建url
// return route('center');
// }]);
路由群组
// // prefix 是路由前缀
// Route::group(['prefix' => 'member'], function(){
// Route::get('user/center', function(){
// return 'member-user-center';
// });
// Route::any('multy2', function(){
// return 'member-multy2';
// });
// });
//
//
// 测试
// http://laravel.study.com/user/center
//
// 报错
// 没有找到该路由
// 因为我们这个路由组 加了一个前缀
// 要访问 群组里的所有路由 都必须加前缀
//
//
// 测试
// http://laravel.study.com/member/user/center
//
// 输出
// member-user-center
//
//
//
// 测试
// http://laravel.study.com/member/multy2
//
// 输出
// member-multy2
路由中输出视图
// Route::get('view', function(){
// // 通过 view 函数 直接返回 渲染后的html
// return view('welcome');
// });
控制器
怎么新建一个控制器
在 目录 app/http/Controllers/ 目录下新建 控制器文件
// 声明命名空间
namespace App\Http\Controllers;
// 定义类
class MemberController extends Controller
{
// 基础
// public function info(){
// return 'Member-info';
// }
// 绑定参数
public function info($id){
return 'Member-info-id-'.$id;
}
}
控制器和路由怎样进行关联
配置 App\Http\目录下的 routes.php
// 换一个 能接受任何请求的
// Route::any('member/info', ['uses'=>'MemberController@info']);
// // 给绑定控制器的路由起别名
// Route::any('member/info', [
// 'uses'=>'MemberController@info',
// 'as' => 'memberinfo'
// ]);
关联控制器后,路由的特性怎么用
// 给绑定控制器的路由起别名
Route::any('member/{id}', [
'uses'=>'MemberController@info',
'as' => 'memberinfo'
])->where('id', '[0-9]+');
// 测试
// http://laravel.study.com/member/123123
//
// 输出
//
// Member-info-id-123123
//
//
// 测试
// http://laravel.study.com/member/aaaa
//
// 报错
// 没有找到该路由
//
视图
怎样新建视图
视图文件存放在 resources\views 目录下
视图的默认后缀名是:.blade.php
文件命名最好和方法名一致
最好一个控制器 对应一个目录
怎样输出视图
// 渲染一个模板文件
// public function info($id){
// return view('member-info');
// }
// 渲染一个模板 带路径
// public function info($id){
// return view('Member/info');
// }
// 渲染一个带变量的模板
public function info($id){
return view('Member/info',[
'name' => '陈小陌',
'age' => '21'
]);
}
模型
怎么新建模型
在APP目录下创建
命名最好和表名称一样并且采用驼峰命名法
File Name: Member.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
public static function getMember(){
return 'name is 陈小陌';
}
}
怎么使用模型
在控制器中映入模型
然后像普通类一样使用就好了。。。
<?php
namespace App\Http\Controllers;
use App\Member;
class MemberController extends Controller
{
// 调用模型中的方法
public function info(){
return Member::getMember();
}
}
数据库操作 DB facade
新建数据表与连接数据库
CREATE TABLE IF NOT EXISTS student(
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
`sex` TINYINT UNSIGNED NOT NULL DEFAULT 10 COMMENT '性别',
`created_at` INT NOT NULL DEFAULT 0 COMMENT '新增时间',
`updated_at` INT NOT NULL DEFAULT 0 COMMENT '修改时间'
)ENGINE=INNODB DEFAULT CHARSET = UTF8 AUTO_INCREMENT=1001 COMMENT='学生表';
数据库配置文件
config/database.php
打开发现 配置值都是通过 env 函数获取的
env 函数 读取的就是根目录的 .env 文件
配置 或修改
DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root
使用DB facade 实现curd
<?php
namespace App\Http\Controllers;
// 引入 Facades DB 类
use Illuminate\Support\Facades\DB;
class StudentController extends Controller
{
/**
* facade CURD
* 使用 DB facade 实现CURD
*/
public function test(){
// // 查询
// $students = DB::select('select * from student');
// // var_dump($students);
// dd($students);
// // array{}
// //
// // 插入
// $id = DB::insert('insert into student(name, age) values(?, ?)', ['陈小陌', '21']);
// var_dump($id);
// // bool(true)
//
// // 插入
// $id = DB::insert('insert into student(name, age) values(?, ?)', ['test', '19']);
// var_dump($id);
// // // bool(true)
//
// // 修改
// $row = DB::update('update student set age= ? where name=?', ['20', 'test']);
// var_dump($row);
// // int(1)
//
//
// // 有条件查询
// $students = DB::select('select * from student where id > ?',[1]);
// dd($students);
// // 删除
// $row = DB::delete('delete from student where id > ?', [1]);
// var_dump($row);
// // int(1)
}
}
数据库操作之 - 查询构造器
查询构造器 简介及新增数据
使用查询构造器修改数据
使用查询构造器删除数据
使用查询构造器查询数据
查询构造器的中的聚合函数
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class StudentController extends Controller
{
// 测试样例
// public function test(){
// return 'test demo';
// }
//
/**
* facade CURD
* 使用 DB facade 实现CURD
*/
public function test(){
// // 查询
// $students = DB::select('select * from student');
// // var_dump($students);
// dd($students);
// // array{}
// //
// // 插入
// $id = DB::insert('insert into student(name, age) values(?, ?)', ['陈小陌', '21']);
// var_dump($id);
// // bool(true)
//
// // 插入
// $id = DB::insert('insert into student(name, age) values(?, ?)', ['test', '19']);
// var_dump($id);
// // // bool(true)
//
// // 修改
// $row = DB::update('update student set age= ? where name=?', ['20', 'test']);
// var_dump($row);
// // int(1)
//
//
// // 有条件查询
// $students = DB::select('select * from student where id > ?',[1]);
// dd($students);
// // 删除
// $row = DB::delete('delete from student where id > ?', [1]);
// var_dump($row);
// // int(1)
}
// 查询构造器简介
// Laravel 查询构造器(query builder)
//
// 使用pdo 参数绑定 以保护程序免于SQL注入,
// 因此传入的参数不需要额外转义特殊字符
//
// 基本可以满足所有数据库操作,
// 而且在所有支持的数据库系统上都可以执行
//
// 使用查询构造器 新增数据
//
public function query(){
// // 单条数据插入
// $status = DB::table('student')->insert(['name'=>'test', 'age'=>18]);
// var_dump($status);
// // bool(true)
// // 新增时 获取新增ID
//
// $id = DB::table('student')->insertGetId(['name'=>'zhangsan', 'age'=>19]);
// var_dump($id);
// // int(4)
// // 批量新增
//
// $status = DB::table('student')->insert([
// ['name'=>'name1', 'age'=>18],
// ['name'=>'name2', 'age'=>12],
// ['name'=>'name3', 'age'=>13]
// ]);
// var_dump($status);
// // bool(true)
//
// dd(DB::select('select * from student'));
}
// 使用查询构造器更新数据
//
//
// 更新为指定的内容
//
// 自增和自减
//
//
public function query2(){
// // 更新数据
// $num = DB::table('student')
// ->where('id', 1)
// ->update(['age'=>22]);
// var_dump($num);
// // int(1)
// // 更新数据一定要带条件
// // 字段 自增
// $num = DB::table('student')->increment('age');
// var_dump($num);
// // int(6)
// // 字段 自增 可定义步长
// $num = DB::table('student')->increment('age', 3);
// var_dump($num);
// // int(6)
// // 字段 自减
// $num = DB::table('student')->decrement('age');
// var_dump($num);
// // int(6)
// // 字段 自减 可定义步长
// $num = DB::table('student')->decrement('age', 3);
// var_dump($num);
// // int(6)
// // 字段自增自减 加条件
// $num = DB::table('student')
// ->where('id', 1)
// ->decrement('age');
// var_dump($num);
// // int(1)
// // 自增时 同时修改别的字段数据
// $num = DB::table('student')
// ->where('id', 1)
// ->decrement('age', 1, ['name'=>'chenxiaomo']);
// var_dump($num);
// // int(1)
}
// 使用查询构造器删除数据
// delete
// truncate
public function query3(){
// $num = DB::table('student')
// ->where('id', 7)
// ->delete();
// var_dump($num);
// // int(1)
// $num = DB::table('student')
// ->where('age', '<', 18)
// ->delete();
// var_dump($num);
// // int(1)
// // 清空表 慎用
// DB::table('student')->truncate();
}
// 使用查询构造器查询数据
// Get 获取表的所有数据
// first 获取一条记录
// where 条件容器
// whereRaw 多条件 容器
// pluck 返回结果集指定的字段 单个
// lists 返回结果集的指定字段 区别是 可以使用摸个字段作为键
// select 查询 指定字段
// chunk 分段的get 分段获取数据
public function query4(){
// 获取表的所有数据
// $data = DB::table('student')->get();
// dump($data);
// 获取一条数据 没有条件时 获取的是第一条
// $data = DB::table('student')->first();
// dump($data);
// // 根据 排序 获取一条
// $data = DB::table('student')
// ->orderBy('id', 'desc')
// ->first();
// dump($data);
// // 加入查询条件
// $data = DB::table('student')
// ->where('age', '>=', '18')
// ->get();
// dump($data);
// // 复合条件 查询
// $data = DB::table('student')
// ->whereRaw('id >= ? and age > ?', [2, 16])
// ->get();
// dump($data);
// // 获取符合条件的 只只查询一个字段用这个
// $data = DB::table('student')
// ->whereRaw('id >= ? and age > ?', [2, 16])
// ->pluck('name');
// // ->pluck('name, age'); 报错 哭
// // ->pluck(['name', 'age']); 报错 哭
// dump($data);
// // 查询指定字段 并且用指定字段做下标
// $data = DB::table('student')->lists('name', 'id');
// dump($data);
// // 查询指定字段
// $data = DB::table('student')
// ->select(['id','name'])
// ->get();
// dump($data);
// chunk
// 如果数据量大 但是要非要都查询出来的情况下 使用 chunk
// 第一个参数是步长
// 第二个是回调函数
// 根据 步长 来约定 每次查询的数据条数 然后循环查询 直到 查询完毕
$data = DB::table('student')->chunk(2, function($data){
dump($data);
// 如果 遇到某个条件 需要终止查询 那么直接返回 false 即可终止
// 实例
// 如果 两个人总的年龄 小于40的话 就退出查询
// (当然应该没有这么奇葩的需求)
$ages = array_column($data, 'age');
if(array_sum($ages) < 40){
return false;
}
});
}
// 查询构造器中的聚合函数
// count
// max
// min
// avg
// sum
public function query5(){
// // 计数
// $data = DB::table('student')->count();
//
// // 最小
// $data = DB::table('student')->min('age');
//
// // 最大
// $data = DB::table('student')->max('age');
//
// // 平均值
// $data = DB::table('student')->avg('age');
//
// // 合计
// $data = DB::table('student')->sum('age');
dump($data);
}
}
数据库操作 Eloquent ORM
Eloquent ORM 简介
Eloquent ORM简介
是 laravel自带的
每个数据表都有一个与之相对应的模型(model)用于和数据表交互
模型的建立
在 APP 目录下创建
文件名和表名一致,且用驼峰命名法表示
如果 类中没有申明 对应的表名称,那么默认是以文件名的复数作为 表名
即:
文件名: student
默认表名: students
如果需要制定表名 就声明一个 $table 属性
// 声明 模型对应的关联表
// 指定表名
protected $table = 'student';
默认主键名为ID 如果不是则需要进行申明
protected $primaryKey = 'id';
最基础的模型 实例
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model{
// 指定表名
protected $table = 'student';
// 指定主键
protected $primaryKey = 'id';
}
Eloquent ORM 中的查询
all() <br />
find() <br />
findOrfail(); <br />
查询构造器在ORM中的使用<br />
// // all 获取表的所有数据
// $students = Student::all();
// dd($students);
// // 打印后 发现都是 集合
// // 数据内容 在 每个 集合 中的 attributes 字段里
//
// 根据主键进行查询
//
// $student = Student::find(1);
// dd($student);
// // 根据主键进行查找 如果没有找到 则抛出异常
// $student = Student::findOrFail(1); // 存在的
// // $student = Student::findOrFail(1001); // 不存在的 抛出异常
// dd($student);
//
// 查询构造器 在 ROM中的使用
// // 查询所有的表数据
// $data = Student::get();
// dump($data);
// 有条件的查询 查询一条记录
// $data = Student::where('id', '>', 1)
// ->orderBy('age', 'desc')
// ->first();
// dump($data);
// // chunk 的使用
// Student::chunk(2, function($students){
// dump($students);
// });
//
// 聚合函数的使用
// $data = Student::count(); // 计数
// $data = Student::max('age'); // 最大值
// $data = Student::where('id', '>', 1)->max('age');
// dump($data);
Eloquent ORM 新增数据, 自定义时间戳 及 批量赋值的使用
// Eloquent ORM 新增数据, 自定义时间戳 及 批量赋值的使用
// 通过模型新增数据 (涉及到自定义时间戳)
// 使用模型的Create方法新增数据(涉及到批量赋值)
public function orm2(){
// 使用模型对象新增数据
// $student = new Student();
// $student->name = 'zhangsan';
// $student->age = 20;
// $status = $student->save();
// dump($status);
// 由于 创建时间 和修改时间的字段名 是 create_at 和 updated_at
// 这两个是能够被 Laravel 框架 自动识别的
// 也就是说能够自动进行维护
// 开启 时间戳的方法
// 在模型中 定义 $timestamps 属性
// 设置 TRUE 为开启
// 设置 FALSE 为关闭
// 我们也可以对 维护时间的两个函数 进行重定义
// 创建函数为 getDateFormat
// 读取函数为 asasDateTime($value)
// 读取 如果默认是时间戳格式的话 会自动转为 2016-11-10 09:49:53 这种格式
// 查询 自动维护时间戳的部分
// $student = Student::find(10);
// // echo $student->created_at;
// echo date("Y-m-d H:i:s", $student->created_at);
// 使用模型的Create方法新增数据
// 默认 模型里 是不允许批量赋值的
// 如果要使用批量赋值 需要到模型 重新定义一个 字段
// 有两个属性来 管理批量赋值 即 $fillable, $guarded
// $fillable 允许批量赋值的字段列表 用 [] 数组表示值
// $guarded 不允许批量赋值的字段列表 用 [] 数组表示值
// $student = Student::create(
// ['name'=> 'imooc', 'age'=> 18]
// );
// dd($student);
// firstOrCreate
// 先按 给出的字段查询数据
// 如果 找到了 就返回数据
// 如果 没找到 就新增一条数据 并 返回创建后的实例
// 存在的
// $status = Student::firstOrCreate(
// ['name'=>'zhangsan']
// );
//
// 不存在的就创建
// $status = Student::firstOrCreate(
// ['name'=> mt_rand(0, 1000)]
// );
// dump($status);
//
// firstOrNew
// 以属性查找 数据
// 如果能查到 数据 就返回数据信息
// 如果没有找到 就创建实例 但是 不像 firstOrCreate直接插入
// 如果需要插入到数据库 则 需要手动 调用 save()
$student = Student::firstOrNew(
['name'=>'imoocsss']
);
dump($student);
exit();
// 保存到数据库
$status = $student->save();
dump($status);
}
使用 Eloquent ORM 修改数据
// 使用 Eloquent ORM 修改数据
public function orm3(){
// 修改单条数据
// 查询数据
// $student = Student::find(13);
// dump($student);
//
// // 修改
// $student->name = ' update one';
// dump($student);
//
// // 保存
// $status = $student->save();
// dump($status);
// 修改多条数据 返回的是影响行数
$status = Student::where('id', '>', 10)->update(['age'=> 28]);
dump($status);
}
使用 Eloquent ORM 删除数据
// 使用 Eloquent ORM 删除数据
public function orm4(){
// 单条删除
// 通过模型删除
// $student = Student::find(14);
// $status = $student->delete();
// dump($status);
// 通过主键删除 返回影响行数
// $status = Student::destroy(13);
// $status = Student::destroy(11, 12);
// $status = Student::destroy([11, 12]);
// 条件 删除
$status = Student::where('id', '>', 6)->delete();
dump($status);
}
Bkade 模板引擎
Blade 模板引擎简介及模板继承的使用
简介
Blade 是 Laravel 自带的模板引擎
模板继承
section
section 是用来定义一个视图片段的
yield
yield 是用来指定某个section 的内容
可以把它想象为占位符
用子模板来实现它
extends
继承某个模板
parent
引入父级的内容
如果没有引入 则 这块内容会被 直接覆盖
实例
主模板 文件路径 \resources\views\section\layouts.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轻松学会Laravel - @yield('title')</title>
<style>
.header {
width: 1000px;
height: 150px;
margin:0 auto;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main {
width: 1000px;
height: 300px;
margin:0 auto;
margin-top: 15px;
clear: both;
}
.main .sidebar {
float: left;
width: 20%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.main .content {
float: right;
width: 75%;
height: inherit;
background: #f5f5f5;
border: 1px solid #ddd;
}
.footer {
width: 1000px;
height: 150px;
margin:0 auto;
margin-top: 15px;
background: #f5f5f5;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="header">
@section('header')
头部
@show
</div>
<div class="main">
<div class="sidebar">
@section('sidebar')
侧边栏
@show
</div>
<div class="content">
@yield('content', '主要内容区域')
</div>
</div>
<div class="footer">
@section('footer')
底部
@show
</div>
</body>
</html>
视图文件设置
<!-- 继承 主模板 -->
@extends('layouts')
<!-- 重新定义头部 -->
@section('header')
<!-- 继承 父级 -->
@parent
header
@stop
<!-- 重新定义 侧边栏 直接覆盖 -->
@section('sidebar')
sidebar
@stop
<!-- 重新定义 内容片段 -->
@section('content')
@parent
content
@stop
基础语法及 include 的使用
模板中输出变量
模板中调用PHP代码
原样输出
模板中的注释
引入子视图 include的使用
二级视图文件
<!-- 继承 主模板 -->
@extends('layouts')
<!-- 重新定义头部 -->
@section('header')
<!-- 继承 父级 -->
@parent
header
@stop
<!-- 重新定义 侧边栏 直接覆盖 -->
@section('sidebar')
sidebar
@stop
<!-- 重新定义 内容片段 -->
@section('content')
content
<!-- 模板中调用变量 -->
<p>{{$name}}</p>
<!-- 模板中 调用PHP 代码-->
<p>{{time()}}</p>
<p>{{date('Y-m-d H:i:s')}}</p>
<p>{{in_array($name, $arr) ? 'true' : 'false'}}</p>
<p>{{var_dump($arr)}}</p>
<p>{{isset($name) ? $name : 'default'}}</p>
<p>{{ $name or 'default'}}</p>
<!-- 原样输出 -->
<p>@{{ $name}}</p>
<!-- 模板中的注释 -->
{{-- 模板中的注释 浏览器中看不到的哦--}}
{{-- 引入子视图--}}
@include('section.common1', ['message'=>'我是错误信息'])
@stop
控制器代码
/**
* 视图学习1
* @return [type] [description]
*/
public function section1(){
$name = 'test';
$arr = ['test', 'imooc'];
return view('section/section1', [
'name'=>$name,
'arr'=>$arr
]);
}
section/common1(inclued 文件) 代码
<p>我是inclued {{ $message }}</p>
流程控制
if
unless
for
foreach
forelse
<!-- 重新定义 内容片段 -->
@section('content')
content
<br>
@if ($name == 'imooc')
I'm imooc
@elseif($name == 'test')
I'm test
@else
who am i?
@endif
<br>
@if (in_array($name, $arr))
true
@else
false
@endif
<br>
<!-- 如果不相等就输出 -->
<!-- unless 意为 if的取反 -->
@unless($name == 'imooc')
I'm imooc
@endunless
<br>
<!-- for 循环 -->
@for($i=1;$i<=5;$i++)
<p>{{$i}}</p>
@endfor
<br>
<!-- foreach 循环 -->
@foreach($students as $student)
<p>{{$student->name}}</p>
@endforeach
<!-- forelse -->
{{-- 如果元素为空 则显示 empty的内容--}}
@forelse($forelse as $student)
<p>{{$student->name}}</p>
@empty
<p>暂无数据</p>
@endforelse
@stop
模板中的url
url
是通过路由的名称来生成 URL
action
是通过制定的控制器和方法 来生产URL
route
是通过路由的别名来生成URL
实例
<a href="{{url('urlTest')}}"> url 路由名称生成</a>
<a href="{{action('StudentController@section2')}}">action 指定控制器和方法名生成</a>
<a href="{{route('url')}}">route 路由别名 生成</a>
课程总结
安装Laravel
核心目录文件
路由
MVC
数据库操作
模板引擎