三种操做数据库的方式。php
Ref: 解读Laravel,看PHP如何实现Facade?css
Facade本质上是一个“把工做推给别人作的”的类。html
Facade存在的价值,能够从服务容器谈起。服务容器,可见个人另外一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.htmljava
举个例子,不知道你们之前写代码有没有过obj->method(arg1,arg2)->func(arg3,arg4);的体验。学过服务容器的读者知道,这行代码就是把服务容器里的对象取出来,并调用他的方法。这对熟悉服务容器里注册过哪些类的开发人员来讲,这种代码仍是能够接受的。可是若是像路由定义那样,也要写成这样冗长的形式,实在太不优雅了。因此用Facade模式能够很好的精简代码长度。mysql
涉及的文件以下,填写好配置文件便可链接成功。laravel
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_PASSWORDsql
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}"
Controller中添加函数链接mySql。 数据库
Ref: Laravel查询构造器简介express
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 涉及到以下内容,具体请见相关连接内容。
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]
思路: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); }
如此,看上去貌似更为人性化。
DB主要是一个查询构造器(SQLBuilder),它会帮你把输入的参数转变成SQL语句去数据库里查询,和你本身手动写SQL语句本质上是同样的。
ORM是一个对象关系映射(Object Relational Mapper)工具,它会把数据库中的数据映射成对象和集合对象,你无需接触底层数据,能够直接调用映射出来的对象进行开发。
DB适合用于对性能要求高或者业务逻辑简单的项目,ORM适合业务逻辑比较复杂的项目。
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); # 手动格式化好的时间
[1] 设置“批量赋值”的属性
== 模型 ==
// 指定容许批量赋值的字段 protected $fillable = ['name', 'age']
// 不容许批量赋值的字段
protected $guarded = [...];
[2] 批量赋值。
== 控制器 ==
$student = Student::create(
['name' => 'imooc', 'age' => 18]
);
dd($student);
先查找,没有则添加。
== 控制器 ==
$stduent = Student::firstOrCreate( ['name' => 'imooc'] }; dd($student);
先创建个对象,而后本身手动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);