thinkphp中什麼是orm

2022-02-14 19:01:06

在thinkphp中,ORM指的是「物件關係對映」,是為方便開發者使用資料庫開發的一個儲存存取層;ORM的主要用途是把物件模型表示的物件對映到基於sql的關係模型資料庫結構中去。

本教學操作環境:Windows7系統、thinkphp v5.1版、Dell G3電腦。

thinkphp中的orm

ORM的全稱是Object Relational Mapping,即物件關係對映

  • O(Object) 物件,在專案中就是實體,更加精確的來說就是資料Model,也可以說持久化類。

  • R(Relation) 關係資料

  • M (Mapping)對映,將物件對映到關係資料,將關係資料對映到物件的過程。

更加直觀理解就是,ORM 就是以OOP思想,產生增刪改查SQL語句。

ThinkPHP的ORM是為方便開發者使用資料庫開發的一個儲存存取層,框架設計圖片如下:

主要用途是:把物件模型表示的物件對映到基於sql的關係模型資料庫結構中去。

當改變這個物件自身的屬性或者呼叫該物件的方法時,相對應的是執行某些sql語句。

這樣子編寫程式碼的人員就可以更好地編寫業務邏輯,而非重複地編寫增刪改查sql語句。

thinkphp中的運用範例

TP框架中關於資料庫操作有兩個模組:

  • 資料庫

  • 模型

tp中的資料庫模組

參照一句檔案的特性描述

拆分為Connection(聯結器)/Query(查詢器)/Builder(SQL生成器)

  • Connection聯結器主要是用來連線資料庫的,可以使用不同的驅動連線不同型別的資料庫。

  • Query查詢器則是用來執行sql語句,處理結果,對映到資料集中。

  • Builder生成器則是用來把我們傳遞進去的條件、排序等轉換成sql語句。

在這3個步驟中,我們可以知道,如果有運用到ORM思想抽象對映的,那就只可能是Query查詢器模組,但是我們可以細查TP檔案中關於資料集的描述。

它更多的是封裝提供對於資料的處理方法,比如:

(以下是從檔案複製過來的 一小部分)

toArray     將資料集的資料轉為陣列
merge   合併其它資料
diff    比較陣列,返回差集
flip    交換資料中的鍵和值
intersect   比較陣列,返回交集
keys    返回資料中的所有鍵名
pop 刪除資料中的最後一個元素
shift   刪除資料中的第一個元素
unshift 在資料開頭插入一個元素
reduce  通過使用使用者自定義函數,以字串返回陣列

但是卻沒有提供反向對映的關係操作,比如我們運算元據集,自動更新資料庫中的資料。

所以在我的理解中,資料庫模組中的ORM思想並不多,重點還是要了解和運用模型

tp中的模型

定義模型檔案

namespace app\index\model;

use think\Model;

// 設定類名 需要遵循轉換規則,蛇形轉為大駝峰
class User extends Model
{
    // 設定主鍵欄位名
    protected $pk = 'u_id';

    // 開啟自動維護時間戳欄位 (什麼時間插入 什麼時間更新)
    protected $autoWriteTimestamp = true;

    // 軟刪除 開啟之後 刪除資料只是用一個欄位來標識為刪除狀態 方便查詢、備份等
    use SoftDelete;
    protected $deleteTime = 'delete_time';

}

以上程式碼比檔案中第一章節模型初始化要多了一些內容,這是為了突出 模型可以完成很多功能

這也是ORM出現的原因:將sql的執行,抽象對映為物件導向程式設計中的物件。

我們可以理解為:表中的一行資料,代表我們程式碼中new一個物件,改變物件,則自動更新表中對應的行。

使用模型

演示的程式碼是比較簡單的,實際是可以很靈活的

比如查詢用非主鍵的條件來查詢、查詢多行記錄等等

<?php
// *******快速查詢、更新*******
// 查詢主鍵=1的資料
$user = User::get(1);
// 然後更改它的name欄位為新的值
$user->name = 'thinkphp';
// 儲存,自己去資料庫給我更新吧~
$user->save();

// *******插入新的一行資料*******
// 新建一個物件(相對應的操作就是新建立一行)
$user = new User;
// 設定欄位的值  有多個欄位就多個設定
$user->name= 'thinkphp';
// 儲存,自己去插入吧~
$user->save();

誤區

看了使用之後,很多初學者就開始寫程式碼了,然而卻使用了不太正確的方式。

① model只當為Db類用

雖然model可以看成db類的超集,但是如果只是把它當成簡單的DB類使用,而不是使用ORM思想去編寫。那麼就沒什麼必要使用它了。。

如果使用不對,不僅不能提高效率,反而會影響自己。(比如程式碼規範不統一、新增表還要新增對應的模型檔案等等)

程式碼演示:

<?php
$userModel = new User(); // 這裡就相當於初始化Db類
$userOneInfo = $userModel->where(['u_id' => 1])->find();

$userTwoInfo = $userModel->where(['u_id' => 2])->find();
// ... 執行其他邏輯 比如判斷上下級 操作許可權等等

// 業務需求不只是讀取使用者的資料這麼簡單
// 還要扣除餘額(就是更新資料庫)
$userOneRes = $userModel->where(['u_id' => 1])->update(['u_balance' => 'xxxx']);

// ... 執行其他邏輯

看到這裡,先停下來思考一下。。你的程式碼有出現過這樣子的嗎?

我相信還是有些人會這樣子用的吧!因為我以前也是這樣子用的。

那麼我們看看正確的使用方法(我認為的,如果覺得不對或者有更好的,歡迎評論交流)

<?php

$userOneInfo = User::get(1);

// 這裡演示使用非主鍵條件查詢的情況!!
// 查詢一個1使用者的下級出來
$userTwoInfo = User::get(function($query){
    $query->where(['p_uid' => 1]);
});

// ... 執行其他邏輯 比如判斷上下級 操作許可權等等

// 業務需求不只是讀取使用者的資料這麼簡單
// 還要扣除餘額(就是更新資料庫)
$userOneInfo->u_balance = 0;
$userOneRes = $userOneInfo->save();

$userTwoInfo->u_balance = 0;
$userTwoRes =  $userTwoInfo->save();

// ... 執行其他邏輯

因為一個物件對映一條資料,所以我們在操作同樣where條件的資料,直接操作物件就可以了, 就不用反覆編寫where u_id =1更新, u_id = 1 要刪除

使用模型,還有很多用處,(得益於開源團隊的奉獻,為我們封裝了大量的功能)

比如:

– 使用者表新增一條資料,另一個附屬表也要用該使用者id初始化一行。

– 自動轉換資料格式(儲存時間戳,查詢出來為2019-7-13 19:53:04格式)。

– 自動校驗資料,自動完成資料(操作的時候預設取操作人ip 許可權等儲存)。

– 關聯查詢(TP中非常強大的功能,在模型中定義好與另一個模型的關係,比如店鋪表中的u_id 可以用來查詢出店鋪所屬使用者的資訊 相當於店鋪模型和使用者模型的關聯 自動join資料 合併 返回給我們使用)

– 等等

總結

ORM是一種思想,概念,代表 物件-關係對映(資料庫-物件 對映)ORM使得對資料的操作抽象為對物件的操作。要學會思想的改變,利用好框架提供的特性,編寫更好地程式碼。TP中的模型非常強大,封裝了大量的邏輯。

【相關教學推薦:】

以上就是thinkphp中什麼是orm的詳細內容,更多請關注TW511.COM其它相關文章!