ThinkPHP的Db類和模型的正確使用姿勢

2022-09-20 12:03:13 字數 2959 閱讀 8358

發現很多開發者在使用thinkphp5.*的時候不明白db和模型的正確使用姿勢,尤其是在5.1版本裡面,如果你沒有使用下面的正確姿勢,有很大可能性會踩坑。

下面是官方推薦的db類用法(也就是每次都是靜態方法呼叫)

//

查詢單個資料

db::name('user')->where('id', 1)->find();

//查詢多個資料

db::name('user')->where('id', '>', 1)->select();

//寫入新的資料

db::name('user')->insert(['name' => '張三']);

//更新資料

db::name('user')->where('id', 1)->update(['name' => '李四']);

//刪除資料

db::name('user')->delete(1);

很多開發者為了簡化**,喜歡使用下面的**。

//

錯誤的用法

$user = db::name('user');

//查詢單個資料

$user->where('id', 1)->find();

//查詢多個資料

$user->where('id', '>', 1)->select();

//寫入新的資料

$user->insert(['name' => '張三']);

//更新資料

$user->update(['name' => '李四']);

//刪除資料

$user->delete(1);

//

仍然是錯誤的用法

// 查詢單個資料

db('user')->where('id', 1)->find();

//查詢多個資料

db('user')->where('id', '>', 1)->select();

//寫入新的資料

db('user')->insert(['name' => '張三']);

//更新資料

db('user')->update(['name' => '李四']);

//刪除資料

db('user')->delete(1);

很多開發者可能會奇怪,為什麼是錯誤的用法呢?我使用的結果明明都沒問題啊?這只是說明你還沒踩坑罷了。

真正的原因,5.1版本每次查詢後是不會清空前次(5.0則會每次清空)的查詢條件的,所以下面的用法是有效的。

$user = db::name('user');

//查詢分數大於80分的使用者總數

$count = $user->where('score', '>', 80)->count

();//

查詢分數大於80分的使用者資料

$user->select();

看到這裡你應該明白了,當你使用的是同乙個資料庫查詢物件例項的話,查詢條件是始終會保留的(也就是會導致後面的查詢條件錯亂),而如果你使用助手函式或者手動例項化後多次操作都是相同的物件例項,除非你像下面一樣手動清除。

$user = db::name('user');

//查詢分數大於80分的使用者總數

$count = $user->where('score', '>', 80)->count

();//

清除查詢條件(但不包括排序或者欄位等資訊)

$user->removeoption('where');

//查詢所有使用者資料 並按分數倒序排列

$user->order('score', 'desc')->select();

//清除所有查詢條件

$user->removeoption();

//查詢分數等於100的使用者

$user->where('score', 100)->select();

模型的設計其實和db一樣,基本上不需要手動進行例項化。

//

寫入新的資料

$user = user::create(['name' => '張三']);

//更新資料

$user->update(['name' => '李四']);

//查詢單個資料

$user = user::get(1);

//刪除當前模型資料

$user->delete();

上面的**中,我們沒有使用任何的例項化**,都是使用靜態方法操作。模型的例項化工作是由系統在查詢或者寫入資料的時候自動完成的。如果你自己手動例項化模型的話,會造成模型的重複例項化開銷。

不建議的用法:

$user = new

user;

//寫入新的資料

$user->name = '張三';

$user->s**e();

$user = new

user;

$user->find(1);

echo

$user->name;

建議用法:

//

寫入新的資料

user::create(['name' => '張三']);

$user = user::get(1);

echo

$user->name;

所以,請不要手動例項化模型,也不建議使用model助手函式。

**

thinkPHP中模型類的定義

在thinkphp中基礎的模型類是think model,該類完成了基本的curd activerecord模式 連貫操作和統計查詢,一些高階特性被封裝到其他模型擴充套件中。基礎模型類的設計非常靈活,甚至可以無需進行任何模型定義,就可以進行相關表的orm和curd操作,只有在需要封裝單獨的業務邏輯時...

thinkphp例項化模型類D和M區別

我們可以用下面兩種方法去建立乙個資料表的對映物件 我暫時用到的 第一種 test d test 第二種 test new model test 雖然這兩種都可以對資料進行select,insert,delete,udpate操作,在資料驗證上有很大的不同,用第一種方式例項乙個模型就會有資料檢查功能,...

ThinkPHP的輸出和模型使用

一 thinkphp的輸出 通過echo 原生態輸出 通過display方法輸出 想分配變數可以使用 this assign 名 值 二 thinkphp的模型使用 需要再方法中通過new model 操作輸出 例如 m new model user user 為表名 m m user 同上,推薦第...