连接数据库


一、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. 图片循环滚动效果shader

    背景无限循环滚动效果,有X和Y轴的速度控制,方便控制.见下图,操作步骤同之前的背景循环设置. shader如下: Shader "Custom/Scroll" { Properti ...

  2. java程序中实现打开 某个指定浏览器

    package com.test; import java.lang.reflect.Method; //实现打开浏览器并跳到指定网址的类 public class BareBonesBrowserL ...

  3. makefile中的shell编程注意点

    参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是 ...

  4. centos7 apache设置伪静态 开启rewrite_module

    设置伪静态除了要生成.htaccess文件外,还需要查看服务器是否开启了rewrite_module.经过一番的纠结,处理方法如下: 编辑Apache配置文件 nano /etc/httpd/conf ...

  5. caffe中的fine-tuning

    caffe finetune两种修改网络结构prototxt方法 第一种方法:将原来的prototxt中所有的fc8改为fc8-re.(若希望修改层的学习速度比其他层更快一点,可以将lr_mult改为 ...

  6. Linux系统中安装使用百度云网盘

    百度云没有Linux客户端,于是有大神用Go语言写出来一个叫BaiduPCS-Go的命令行盘客户端,可以通过终端操作百度云盘,在Linux上实现上传下载.但是因为是命令行版本的,对没有命令行使用基础的 ...

  7. ArrayList vs LinkedList 空间占用

    空间占用上,ArrayList完胜 看下两者的内存占用图   这三个图,横轴是list长度,纵轴是内存占用值.两条蓝线是LinkedList,两条红线是ArrayList,可以看到,LinkedLis ...

  8. 关于input时间框设置了弹出选择就不能手动输入的控制

    <input class="Wdate" onclick="WdatePicker({minDate:'#F{$dp.$D(\'startDate\');}',ma ...

  9. OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  10. SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本

    在之前介绍一下EasyQuery工具SNF开发平台WinForm-EasyQuery统计分析-效果-非常牛逼的报表查询工具 Winform开发框架之图表报表在线设计器-报表-SNF.EasyQuery ...