十、Eloquent ORM
Active Record
每一张表都有一个与之对应的模型Model
1、模型建立及查询数据
默认关联模型名称的复数表名
默认以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]新增数据
# 取消自动维护时间字段,一般设置为true public $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');
参考
PHP 的 date 日期时间函数库简介
如果不生效需要修改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
<h1>@yield('title', '标题')</h1> <div> @section('main') 主要内容 @show </div>
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); } }
编译结果
<h1>重写标题</h1> <div>主要内容重写内容</div>
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、注释 {{-- 这是模板注释,看不到 --}} <!-- 这是html注释,可以看到 --> // 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种
模板引擎