[Laravel] 03 - DB facade, Query builder & Eloquent ORM
连接数据库
一、Outline
三种操作数据库的方式。
二、Facade(外观)模式
Ref: 解读Laravel,看PHP如何实现Facade?
Facade本质上是一个“把工作推给别人做的”的类。
Facade存在的价值,可以从服务容器谈起。服务容器,可见我的另一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.html
举个例子,不知道大家以前写代码有没有过obj->method(arg1,arg2)->func(arg3,arg4);的体验。学过服务容器的读者知道,这行代码就是把服务容器里的对象取出来,并调用他的方法。这对熟悉服务容器里注册过哪些类的开发人员来说,这种代码还是可以接受的。但是如果像路由定义那样,也要写成这样冗长的形式,实在太不优雅了。所以用Facade模式可以很好的精简代码长度。
三、如何连接
涉及的文件如下,填写好配置文件即可连接成功。
- config/database.php
- .env
[config/database.php]
- 'connections' => [
- 'sqlite' => [
- 'driver' => 'sqlite',
- 'database' => env('DB_DATABASE', database_path('database.sqlite')),
- 'prefix' => '',
- ],
- 'mysql' => [
- 'driver' => 'mysql',
- 'host' => env('DB_HOST', '127.0.0.1'),
- 'port' => env('DB_PORT', '3306'),
- 'database' => env('DB_DATABASE', 'forge'),
- 'username' => env('DB_USERNAME', 'forge'),
- 'password' => env('DB_PASSWORD', ''),
- 'unix_socket' => env('DB_SOCKET', ''),
- 'charset' => 'utf8mb4',
- 'collation' => 'utf8mb4_unicode_ci',
- 'prefix' => '',
- 'strict' => true,
- 'engine' => null,
- ],
填写四个属性:DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD
- APP_NAME=Laravel
- APP_ENV=local
- APP_KEY=base64:qddbSfYhoK3ZKyRQSo4effaeR9ABBIwmA7GoyF3gQjg=
- APP_DEBUG=true
- APP_URL=http://localhost
- LOG_CHANNEL=stack
- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=homestead
- DB_USERNAME=homestead
- DB_PASSWORD=secret
- BROADCAST_DRIVER=log
- CACHE_DRIVER=file
- SESSION_DRIVER=file
- SESSION_LIFETIME=120
- QUEUE_DRIVER=sync
- REDIS_HOST=127.0.0.1
- REDIS_PASSWORD=null
- REDIS_PORT=6379
- MAIL_DRIVER=smtp
- MAIL_HOST=smtp.mailtrap.io
- MAIL_PORT=2525
- MAIL_USERNAME=null
- MAIL_PASSWORD=null
- MAIL_ENCRYPTION=null
- PUSHER_APP_ID=
- PUSHER_APP_KEY=
- PUSHER_APP_SECRET=
- PUSHER_APP_CLUSTER=mt1
- MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
- MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
四、SQL语句 操作
Controller中添加函数连接mySql。
查询构造器
一、什么东西?
Ref: Laravel查询构造器简介
Ref: 查询构造器-示例文档
其实就是更为安全地操作数据库的方式,具体有三方面的好处:
(1) Laravel查询构造器(query builder)提供方便、流畅的接口,用来建立及执行数据库查找语法
(2) 使用PDO参数绑定,以保护应用程序免于SQL注入。因此传入的参数不需额外转义特殊字符
(3) 基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行
二、数据库操作
- 新增数据
在 Controller 中,添加路由以及对应的映射方法。
[routes.php]
- Route::any('query1', ['uses' => 'StudentController@query1']);
[app/Http/Controllers/StudentController.php]
- public function query1()
- {
- $bool = DB:table('student')->insert(
- ['name' => 'imnoc', 'age' => 18]
- );
- var_dump($bool):
- }
Next 涉及到如下内容,具体请见相关链接内容。
Eloquent ORM
一、数据库模型
Ref: ORM框架使用优缺点
对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。
A . 简单:ORM以最基本的形式建模数据。比如ORM会将MySQL的一张表映射成一个Java类(模型),表的字段就是这个类的成员变量
B . 精确:ORM使所有的MySQL数据表都按照统一的标准精确地映射成java类,使系统在代码层面保持准确统一
C . 易懂:ORM使数据库结构文档化。比如MySQL数据库就被ORM转换为了java程序员可以读懂的java类,java程序员可以只把注意力放在他擅长的java层面(当然能够熟练掌握MySQL更好)
D . 易用:ORM包含对持久类对象进行CRUD操作的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是讲sql查询全部封装成了编程语言中的函数,通过函数的链式组合生成最终的SQL语句。通过这种封装避免了不规范、冗余、风格不统一的SQL语句,可以避免很多人为Bug,方便编码风格的统一和后期维护。
比如有一个表:Student
[app/Student.php]
二、访问ORM模型
思路:routes.php --> StudentController.php --> Student.php [orm model]
[StudentController.php]
- public function orm1()
- {
- $stduents = Student::all(); // --> 调用了我们自己建立的ORM模型
$students = Student::find(1001); // --> 返回id:1001的数据
$students = Student::findOrFail(1006); // --> 查不到就报错
- # 查询构造器方法
$students = Student::get()
$stduent = Student::where('id', '>', '1001') // 与find很像
->orderBy('age', 'desc')
->first();- echo '<pre>';
Student::chunk(2, function($students) {
var_dump($stduents);
});- # 聚合函数
$num = Student::count();
$max = Student::where('id', '>', 1001)->max('age');- dd($students); // 打印格式更好
var_dump($student);- }
如此,看上去貌似更为人性化。
- ORM与查询构造器的关系?
DB主要是一个查询构造器(SQLBuilder),它会帮你把输入的参数转变成SQL语句去数据库里查询,和你自己手动写SQL语句本质上是一样的。
ORM是一个对象关系映射(Object Relational Mapper)工具,它会把数据库中的数据映射成对象和集合对象,你无需接触底层数据,可以直接调用映射出来的对象进行开发。
DB适合用于对性能要求高或者业务逻辑简单的项目,ORM适合业务逻辑比较复杂的项目。
三、新增数据
- Save 新增一条数据
ORM模型中自带的save()函数用于写入数据库。
ORM自动会维护,生成created_at, updated_at。
- 对于时间的处理
[1] 忽略时间戳,这里设置为false,则不会自动改变created_at以及updated_at。
[app/Student.php]
- == 模型 ==
- public $timestamps = true;
- protected function getDateFormat()
{
return time();
}- proteacted function asDateTime($val)
{
return $val;
}
上述俩函数看样子是重写了方法,也即是父类Model中的方法,效果就是改变了时间相关的内容。
[2] 返回数据库中的时间内容。
- == 控制器 ==
- $student = Student::find(1017);
- echo $student->created_at; #已经格式化好了
echo date('Y-m-d H:i:s', $student->created_at); # 手动格式化好的时间
- Create 增加一条数据
[1] 设置“批量赋值”的属性
- == 模型 ==
- // 指定允许批量赋值的字段
- protected $fillable = ['name', 'age']
- // 不允许批量赋值的字段
protected $guarded = [...];
[2] 批量赋值。
- == 控制器 ==
- $student = Student::create(
['name' => 'imooc', 'age' => 18]
);- dd($student);
- FirstOrCreate 增加数据
先查找,没有则添加。
- == 控制器 ==
- $stduent = Student::firstOrCreate(
- ['name' => 'imooc']
- };
- dd($student);
- FirstOrNew 增加数据
先建立个对象,然后自己手动save写入数据库。
- == 控制器 ==
- $stduent = Student::firstOrNew(
- ['name' => 'imoocsss']
- };
- # 到此其实没有写入数据库
$bool = $student->save();- dd($bool);
四、更新数据
- 更新一条数据
- == 控制器 ==
- $stduent = Student::find(1021);
$student->name = 'kitty';
$bool = $student->save();- var_dump($bool);
- 批量更新数据
- == 控制器 ==
# 这里是查询构造器的方式- $num = Student::where('id', '>', 1019)->update(
['age' => 41]
);- var_dump($num);
五、删除数据
- 通过模型删除
- == 控制器 ==
- $stduent = Student::find(1021);
$bool = $student->delete();- var_dump($bool);
- 通过主键删除
- == 控制器 ==
- $num = Student::destroy(1018, 1019); // 这里删除两条记录
$num = Student::destroy([1018, 1019]); // 这里删除两条记录,数组法- var_dump($num);
- 删除指定条件
- == 控制器 ==
- $num = Student::where('id', '>', 1004)->delete();
- var_dump($num);
[Laravel] 03 - DB facade, Query builder & Eloquent ORM的更多相关文章
- laravel 数据库操作之 DB facade & 查询构造器 & Eloquent ORM
<?php namespace App\Http\Controllers; use App\Student; use Illuminate\Support\Facades\DB; class S ...
- laravel query builder/ Eloquent builder 添加自定义方法
上次干这事已经是一年前了,之前的做法特别的繁琐.冗余,具体就是创建一个自定义 Builder 类,继承自 Query\Builder,然后覆盖 Connection 里面获取 Builder 的方法, ...
- Laravel 学习笔记之数据库操作——Eloquent ORM
1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...
- laravel数据库操作sql语句用Eloquent ORM来构造
现在有查询语句: SELECT users.sNmame, users.iCreateTime, users_ext.iAge, users_ext.sSex FROM users LEFT JOIN ...
- laravel的Eloquent中的get()和Query/Builder中的get()
Eloquent 中的get实际上是Eloquent/Builder中的get,得到的结果是个Collection对象,再调用Collection的first才得到collection中的一项,即一个 ...
- Laravel Eloquent ORM 时如何查询表中指定的字段
导读:在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应...原文地址:http: ...
- [Laravel] 16 - DB: Eloquent
前言 一.大纲 写后端API,与数据库打交道无疑是很重要的角色. PHP数据库操作:从MySQL原生API到PDO PHP数据库操作:使用ORM Ref: [PHP] 07 - Json, XML a ...
- Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by
案例 案例:Laravel 在文章列表中附带上前10条评论?,在获取文章列表时同时把每个文章的前10条评论一同查询出来. 这是典型分区查询案例,需要根据 comments 表中的 post_id 字段 ...
- Laravel Eloquent ORM
Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...
随机推荐
- git 快照及分支
分支介绍 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平 ...
- memcache 在php中的用法
memcached 的安装方法详见我博客的另一个页面:http://www.cnblogs.com/chrdai/p/6656443.html 用法: 一.memcache 连接命令: 1.memca ...
- android studio 中去除应用标题栏
android studio 中去除应用标题栏 ㈠ ⒈ mainifests中设置: android:theme="@style/AppTheme"(即默认设置). ⒉ value ...
- 使用three.js写全景图,使用sprite类canvas,结合射线,点击跳转指定全景图【转】
https://blog.csdn.net/WDCCSDN/article/details/81214804 话不多说上代码: 1.html: <!DOCTYPE html> < ...
- H5使用Swiper过程中遇到的滑动冲突
一.问题 (1)PC端可以鼠标可以拖动中间的轮子让页面上下滑动,点击左键按着也是拖不动 (2)手机端浏览H5手指不能滑动页面,导致很多页面下面的文字看不到 二.解决问题 1.下面分先说css的问题,主 ...
- Duplicate复制数据库并创建物理StandBy(spfile版本)
过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...
- maven 设置跳过测试
1.在执行mvn命令时增加以下参数可以跳过测试: -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test ...
- Git 安装(分布式版本控制系统)
1.在 Windows 上安装 在 Windows 上安装 Git 也有几种安装方法. 官方版本可以在 Git 官方网站下载,打开下载会自动开始.要注意这是一个名为 Git for Windows 的 ...
- CPP Note
hello.cpp -> 编译代码g++ hello.cpp -o a -> a.out 区分大小写的编程语言 内置类型 一些基本类型可以使用一个或多个类型修饰符进行修饰: signed: ...
- Effective Java 第三版——36. 使用EnumSet替代位属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...