连接数据库


一、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的更多相关文章

  1. laravel 数据库操作之 DB facade & 查询构造器 & Eloquent ORM

    <?php namespace App\Http\Controllers; use App\Student; use Illuminate\Support\Facades\DB; class S ...

  2. laravel query builder/ Eloquent builder 添加自定义方法

    上次干这事已经是一年前了,之前的做法特别的繁琐.冗余,具体就是创建一个自定义 Builder 类,继承自 Query\Builder,然后覆盖 Connection 里面获取 Builder 的方法, ...

  3. Laravel 学习笔记之数据库操作——Eloquent ORM

    1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...

  4. laravel数据库操作sql语句用Eloquent ORM来构造

    现在有查询语句: SELECT users.sNmame, users.iCreateTime, users_ext.iAge, users_ext.sSex FROM users LEFT JOIN ...

  5. laravel的Eloquent中的get()和Query/Builder中的get()

    Eloquent 中的get实际上是Eloquent/Builder中的get,得到的结果是个Collection对象,再调用Collection的first才得到collection中的一项,即一个 ...

  6. Laravel Eloquent ORM 时如何查询表中指定的字段

    导读:在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应...原文地址:http: ...

  7. [Laravel] 16 - DB: Eloquent

    前言 一.大纲 写后端API,与数据库打交道无疑是很重要的角色. PHP数据库操作:从MySQL原生API到PDO PHP数据库操作:使用ORM Ref: [PHP] 07 - Json, XML a ...

  8. Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by

    案例 案例:Laravel 在文章列表中附带上前10条评论?,在获取文章列表时同时把每个文章的前10条评论一同查询出来. 这是典型分区查询案例,需要根据 comments 表中的 post_id 字段 ...

  9. Laravel Eloquent ORM

    Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...

随机推荐

  1. 在Win7 64位旗舰版下,利用Vs2008编译64位的Qt 4.8.2

    1.下载qt-everywhere-opensource-src-4.8.2.zip. 2.VS2008需要安装x64编译器. 3.将qt-everywhere-opensource-src-4.8. ...

  2. Instruments

    链接: iOS性能优化:Instruments使用实战 iOS 使用Instruments的工具小结    

  3. GO开发环境搭建

    GO开发环境搭建 1)下载GO SDK,并安装 https://golang.google.cn/dl/ 2)下载GO IDE:GOLAND,并安装 3)设置GOROOT和GOPATH 4)新建一个工 ...

  4. tomcat管理页面403 Access Denied的解决方法

    安装tomcat,配置好tomcat环境变量以后,访问manager app页面,出现403 Access Denied错误,解决的方法如下: 首先在conf/tomcat-users.xml文件里面 ...

  5. jquery操作radio,checkbox

    1. 获取radio选中的value. $('input:radio[name=sex]:checked').val(); 2. 选择 radio 按钮 (Male). $('input:radio[ ...

  6. 【FFmpeg】ffplay播放rtsp视频流花屏问题 (转)

    问题描述:ffplay播放rtsp视频流时,播放过程中随机出现花屏现象. 基本流程学习:阅读ffplay源码,熟悉其播放rtsp视频流的基本流程. 在ffplay源码阅读和分析的基础上,画出了其播放r ...

  7. web打印控件Lodop轻松输出清晰的图表和条码

    一.仅用两行语句实现极其复杂的图表打印.类似如下两句: LODOP.ADD_PRINT_CHART(0,0,400,400,5,document.getElementByI d('table001') ...

  8. Nginx关于跨域的配置

    参考:https://www.cnblogs.com/sunmmi/articles/5956554.html 最终我们项目中的配置如下: upstream boss_gateway { server ...

  9. Window下对nodejs多版本管理GNVM

    Windows下对nodejs多版本的管理,实现随意切换! 官方地址: https://github.com/Kenshin/gnvm http://ksria.com/gnvm/ 01.下载GNVM ...

  10. ubuntu下解压文件命令大全(转)

    ubuntu 下rar解压工具安装方法: 压缩功能 安装 sudo apt-get install rar卸载 sudo apt-get remove rar 解压功能 安装 sudo apt-get ...