[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}"
View Code

 

  

四、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);

 

posted @ 2018-07-01 15:50  郝壹贰叁  阅读(529)  评论(0编辑  收藏  举报