连接数据库


一、Outline

三种操作数据库的方式。

二、Facade(外观)模式

Ref: 解读Laravel,看PHP如何实现Facade?

Facade本质上是一个“把工作推给别人做的”的类。

Facade存在的价值,可以从服务容器谈起。服务容器,可见我的另一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.html

举个例子,不知道大家以前写代码有没有过obj->method(arg1,arg2)->func(arg3,arg4);的体验。学过服务容器的读者知道,这行代码就是把服务容器里的对象取出来,并调用他的方法。这对熟悉服务容器里注册过哪些类的开发人员来说,这种代码还是可以接受的。但是如果像路由定义那样,也要写成这样冗长的形式,实在太不优雅了。所以用Facade模式可以很好的精简代码长度。

三、如何连接

涉及的文件如下,填写好配置文件即可连接成功。

  1. config/database.php
  2. .env

[config/database.php]

  1. 'connections' => [
  2.  
  3. 'sqlite' => [
  4. 'driver' => 'sqlite',
  5. 'database' => env('DB_DATABASE', database_path('database.sqlite')),
  6. 'prefix' => '',
  7. ],
  8.  
  9. 'mysql' => [
  10. 'driver' => 'mysql',
  11. 'host' => env('DB_HOST', '127.0.0.1'),
  12. 'port' => env('DB_PORT', '3306'),
  13. 'database' => env('DB_DATABASE', 'forge'),
  14. 'username' => env('DB_USERNAME', 'forge'),
  15. 'password' => env('DB_PASSWORD', ''),
  16. 'unix_socket' => env('DB_SOCKET', ''),
  17. 'charset' => 'utf8mb4',
  18. 'collation' => 'utf8mb4_unicode_ci',
  19. 'prefix' => '',
  20. 'strict' => true,
  21. 'engine' => null,
  22. ],

填写四个属性:DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD

  1. APP_NAME=Laravel
  2. APP_ENV=local
  3. APP_KEY=base64:qddbSfYhoK3ZKyRQSo4effaeR9ABBIwmA7GoyF3gQjg=
  4. APP_DEBUG=true
  5. APP_URL=http://localhost
  6.  
  7. LOG_CHANNEL=stack
  8.  
  9. DB_CONNECTION=mysql
  10. DB_HOST=127.0.0.1
  11. DB_PORT=3306
  12. DB_DATABASE=homestead
  13. DB_USERNAME=homestead
  14. DB_PASSWORD=secret
  15.  
  16. BROADCAST_DRIVER=log
  17. CACHE_DRIVER=file
  18. SESSION_DRIVER=file
  19. SESSION_LIFETIME=120
  20. QUEUE_DRIVER=sync
  21.  
  22. REDIS_HOST=127.0.0.1
  23. REDIS_PASSWORD=null
  24. REDIS_PORT=6379
  25.  
  26. MAIL_DRIVER=smtp
  27. MAIL_HOST=smtp.mailtrap.io
  28. MAIL_PORT=2525
  29. MAIL_USERNAME=null
  30. MAIL_PASSWORD=null
  31. MAIL_ENCRYPTION=null
  32.  
  33. PUSHER_APP_ID=
  34. PUSHER_APP_KEY=
  35. PUSHER_APP_SECRET=
  36. PUSHER_APP_CLUSTER=mt1
  37.  
  38. MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
  39. MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

四、SQL语句 操作

Controller中添加函数连接mySql。

查询构造器


一、什么东西?

Ref: Laravel查询构造器简介

Ref: 查询构造器-示例文档

其实就是更为安全地操作数据库的方式,具体有三方面的好处:

(1) Laravel查询构造器(query builder)提供方便、流畅的接口,用来建立及执行数据库查找语法

(2) 使用PDO参数绑定,以保护应用程序免于SQL注入。因此传入的参数不需额外转义特殊字符

(3) 基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行

二、数据库操作

  • 新增数据

在 Controller 中,添加路由以及对应的映射方法。

[routes.php]

  1. Route::any('query1', ['uses' => 'StudentController@query1']);

[app/Http/Controllers/StudentController.php]

  1. public function query1()
  2. {
  3.   $bool = DB:table('student')->insert(
  4.     ['name' => 'imnoc', 'age' => 18]
  5.   );
  6.  
  7.   var_dump($bool):
  8. }

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]

  1. public function orm1()
  2. {
  3.   $stduents = Student::all();   // --> 调用了我们自己建立的ORM模型
      $students = Student::find(1001);   // --> 返回id:1001的数据
      $students = Student::findOrFail(1006);  // --> 查不到就报错
  1.   # 查询构造器方法
      $students = Student::get()
      $stduent = Student::where('id', '>', '1001')  // 与find很像
        ->orderBy('age', 'desc')
        ->first();
  2.  
  3.   echo '<pre>';
      Student::chunk(2, function($students) {
        var_dump($stduents);
      });
  4.  
  5.   # 聚合函数
      $num = Student::count();
      $max = Student::where('id', '>', 1001)->max('age');
  6.   dd($students);    // 打印格式更好
      var_dump($student);
  7. }

如此,看上去貌似更为人性化。

  • 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]

  1. == 模型 ==
  2.  
  3. public $timestamps = true;
  4.  
  5. protected function getDateFormat()
    {
      return time();
    }
  6.  
  7. proteacted function asDateTime($val)
    {
      return $val;
    }

上述俩函数看样子是重写了方法,也即是父类Model中的方法,效果就是改变了时间相关的内容。

[2] 返回数据库中的时间内容。

  1. == 控制器 ==
  2.  
  3. $student = Student::find(1017);
  4. echo $student->created_at;    #已经格式化好了
    echo date('Y-m-d H:i:s', $student->created_at);  # 手动格式化好的时间
  • Create 增加一条数据

[1] 设置“批量赋值”的属性

  1. == 模型 ==
  1. // 指定允许批量赋值的字段
  2. protected $fillable = ['name', 'age']
  3.  
  4. // 不允许批量赋值的字段
    protected $guarded = [...];

[2] 批量赋值。

  1. == 控制器 ==
  2.  
  3. $student = Student::create(
      ['name' => 'imooc', 'age' => 18]
    );
  4.  
  5. dd($student); 
  • FirstOrCreate 增加数据

先查找,没有则添加。

  1. == 控制器 ==
  2.  
  3. $stduent = Student::firstOrCreate(
  4.   ['name' => 'imooc']
  5. };
  6.  
  7. dd($student);
  • FirstOrNew 增加数据

先建立个对象,然后自己手动save写入数据库。

  1. == 控制器 ==
  2.  
  3. $stduent = Student::firstOrNew(
  4.   ['name' => 'imoocsss']
  5. };
  6.  
  7. # 到此其实没有写入数据库
    $bool = $student->save();
  8.  
  9. dd($bool);

四、更新数据

  • 更新一条数据
  1. == 控制器 ==
  2.  
  3. $stduent = Student::find(1021);
    $student->name = 'kitty';
    $bool = $student->save();
  4.  
  5. var_dump($bool);
  • 批量更新数据
  1. == 控制器 ==

  2. # 这里是查询构造器的方式
  3. $num = Student::where('id', '>', 1019)->update(
      ['age' => 41]
    );
  4.  
  5. var_dump($num);

  

五、删除数据

  • 通过模型删除
  1. == 控制器 ==
  2.  
  3. $stduent = Student::find(1021);
    $bool = $student->delete();
  4.  
  5. var_dump($bool);
  • 通过主键删除
  1. == 控制器 ==
  2.  
  3. $num = Student::destroy(1018, 1019);   // 这里删除两条记录
    $num = Student::destroy([1018, 1019]);  // 这里删除两条记录,数组法
  4.  
  5. var_dump($num);
  • 删除指定条件
  1. == 控制器 ==
  2.  
  3. $num = Student::where('id', '>', 1004)->delete();
  4.  
  5. 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. 自动部署tomcat 脚本

    自动部署tomcat 脚本 . /etc/init.d/functions #调用系统函数 yum -y install java >/dev/null TAR="apache-tom ...

  2. __NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xb000000000000003

    出现这个报错的原因是:拿数字与字符串进行对比了. 检查两边的数据格式是否一致 如果不一致,可以使用[nsstring stringwithformate:@"%d",xx]包装一下 ...

  3. 喵哈哈村的魔法考试 Round #9 (Div.2) 题解

    A题 喵哈哈村的数据筛选游戏 题解:这道题签到题,拿个数组记录一下这个数是否出现过即可. #include<bits/stdc++.h> using namespace std; cons ...

  4. boost 1.67编译VS2017版本

    最近想系统学习并使用一下boost的asio异步网络库,所以需要编译boost库使用,下面简单介绍如何编译. 编译环境 boost1.67版本,windows 10,VS2017 下载boost 建议 ...

  5. Linux进程优先级系统——设置实时进程优先级

    前言 最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A ...

  6. js selection对象使用方法

    IE:document.selection FireFox:window.getSelection() document.selection只有IE支持,window.getSelection()也只 ...

  7. Win8下枚举任意进程的句柄表。。。(VB6 Code)

    添加一个Command1.一个List1,代码: Private Type PROCESS_HANDLE_TABLE_ENTRY_INFO HandleValue As Long HandleCoun ...

  8. 移动端适配方案 flexible.js

    前言 移动端适配一直以来都是前端开发中不可或缺的重要组成部分,如果没有了它,那么你做出来的页面极有可能会出现各种意外(写出来的页面与设计稿之间的差别).所有我们得找到一种相对来说让人比较满意的解决方案 ...

  9. CentOS 6下 Oracle11gR2 设置开机自启动

    [1] 更改/etc/oratab # This file is used by ORACLE utilities. It is created by root.sh # and updated by ...

  10. 【strpos】php的strpos的坑,记一次

    php > var_dump(strpos('开始23测试ceshi', '测试')); int(8) php > var_dump(mb_strpos('开始23测试ceshi', '测 ...