[Laravel] 03 - DB facade, Query builder & Eloquent ORM

鏈接數據庫


1、Outline

三種操做數據庫的方式。php

 

 

2、Facade(外觀)模式

Ref: 解讀Laravel,看PHP如何實現Facade?css

Facade本質上是一個「把工做推給別人作的」的類。html

Facade存在的價值,能夠從服務容器談起。服務容器,可見個人另外一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.htmljava

舉個例子,不知道你們之前寫代碼有沒有過obj->method(arg1,arg2)->func(arg3,arg4);的體驗。學過服務容器的讀者知道,這行代碼就是把服務容器裏的對象取出來,並調用他的方法。這對熟悉服務容器裏註冊過哪些類的開發人員來講,這種代碼仍是能夠接受的。可是若是像路由定義那樣,也要寫成這樣冗長的形式,實在太不優雅了。因此用Facade模式能夠很好的精簡代碼長度。mysql

 

 

3、如何鏈接

涉及的文件以下,填寫好配置文件便可鏈接成功。laravel

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_PASSWORDsql

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

 

  

4、SQL語句 操做

Controller中添加函數鏈接mySql。 數據庫

 

 

 

查詢構造器


1、什麼東西?

Ref: Laravel查詢構造器簡介express

Ref: 查詢構造器-示例文檔

其實就是更爲安全地操做數據庫的方式,具體有三方面的好處:

(1) Laravel查詢構造器(query builder)提供方便、流暢的接口,用來創建及執行數據庫查找語法

(2) 使用PDO參數綁定,以保護應用程序免於SQL注入。所以傳入的參數不需額外轉義特殊字符

(3) 基本能夠知足全部的數據庫操做,並且在全部支持的數據庫系統上均可以執行

 

2、數據庫操做

  • 新增數據

在 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


1、數據庫模型

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]

 

 

2、訪問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適合業務邏輯比較複雜的項目。

 

 

3、新增數據

  • 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);

 

 

4、更新數據

  • 更新一條數據
== 控制器 ==

$stduent = Student::find(1021);
$student->name = 'kitty';
$bool = $student->save();

var_dump($bool);

 

  • 批量更新數據
== 控制器 ==

# 這裏是查詢構造器的方式 $num = Student::where('id', '>', 1019)->update(
  ['age' => 41]
);

var_dump($num);

   

 

5、刪除數據

  •  經過模型刪除
== 控制器 ==

$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);
相關文章
相關標籤/搜索