中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

thinkphp中的orm是什么

發布時間:2022-02-15 10:49:30 來源:億速云 閱讀:255 作者:iii 欄目:編程語言

這篇文章主要介紹“thinkphp中的orm是什么”,在日常操作中,相信很多人在thinkphp中的orm是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”thinkphp中的orm是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在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數據 合并 返回給我們使用)

– 等等

到此,關于“thinkphp中的orm是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

营口市| 鱼台县| 临清市| 广河县| 大宁县| 通河县| 吴忠市| 阿图什市| 迭部县| 浪卡子县| 康马县| 郧西县| 维西| 岳西县| 九龙县| 广水市| 麟游县| 大丰市| 青州市| 阆中市| 和林格尔县| 烟台市| 东方市| 拉萨市| 马尔康县| 离岛区| 辰溪县| 益阳市| 桐城市| 吴桥县| 孟连| 石渠县| 宣恩县| 北票市| 和顺县| 迁西县| 长治县| 敦煌市| 鸡东县| 紫阳县| 方山县|