首頁 >php框架 >ThinkPHP >thinkphp中什麼是orm

thinkphp中什麼是orm

青灯夜游
青灯夜游原創
2022-02-14 17:04:064286瀏覽

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

thinkphp中什麼是orm

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

thinkphp中的orm

ORM的全名為Object Relational Mapping,也就是物件關係對應

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

  • R(Relation) 關聯式資料

  • M (Mapping)映射,將物件映射到關聯數據,將關係資料映射到物件的過程。

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

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

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 = &#39;thinkphp&#39;;
// 保存,自己去数据库给我更新吧~
$user->save();

// *******插入新的一行数据*******
// 新建一个对象(相对应的操作就是新创建一行)
$user = new User;
// 设置字段的值  有多个字段就多个设置
$user->name= &#39;thinkphp&#39;;
// 保存,自己去插入吧~
$user->save();

誤解

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

① model只當為Db類別用

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

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

程式碼示範:

<?php
$userModel = new User(); // 这里就相当于初始化Db类
$userOneInfo = $userModel->where([&#39;u_id&#39; => 1])->find();

$userTwoInfo = $userModel->where([&#39;u_id&#39; => 2])->find();
// ... 执行其他逻辑 比如判断上下级 操作权限等等

// 业务需求不只是读取用户的数据这么简单
// 还要扣除余额(就是更新数据库)
$userOneRes = $userModel->where([&#39;u_id&#39; => 1])->update([&#39;u_balance&#39; => &#39;xxxx&#39;]);

// ... 执行其他逻辑

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

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

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

<?php

$userOneInfo = User::get(1);

// 这里演示使用非主键条件查询的情况!!
// 查询一个1用户的下级出来
$userTwoInfo = User::get(function($query){
    $query->where([&#39;p_uid&#39; => 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框架

以上是thinkphp中什麼是orm的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn