连接数据库


一、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. Saltstack cp.get 模块

    语法 salt '*' cp.get_file salt://rr /etc/rr cp.get_url  可以从一个URL地址下载文件,URL可以是msater上的路径(salt://),也可以是h ...

  2. react-native ES5与ES6写法对照表

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-es5-and-es6-writing-tabl ...

  3. Linux内核笔记:epoll实现原理(二)

    在通过epoll_ctl(2)向epoll中添加被监视文件描述符时,会将ep_poll_callback()作为回调函数添加被监视文件的等待队列中.下面分析ep_poll_callback()函数 1 ...

  4. keybd_event 被 SendInput 替代

    keybd_event   函数功能:该函数合成一次击键事件.系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,键盘驱动程序的中断处理程序调用keybd_event函数.在 ...

  5. WordPress主题开发:输出指定页面导航

    实例: <ul> <li class="widget widget_nav_menu"> <?php if(is_page(array(12,14,1 ...

  6. org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param w

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...

  7. Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航

    一.问题描述 PagerSlidingTabStrip是android开源项目,指示器控件.官网地址:https://github.com/astuetz/PagerSlidingTabStrip 该 ...

  8. Vert.x入门教程之Hello World

    http://blog.csdn.net/caihuangshi/article/details/51648182

  9. how to use boost program options

    From:  http://www.radmangames.com/programming/how-to-use-boost-program_options If it so happens that ...

  10. 启动exe

    public void OpenTabTip(){    bool bt = true;    Process[] processes = Process.GetProcesses();    for ...