ThinkPHP:Db類和模型的正確使用

ThinkPHP:Db類和模型的正確使用

發(fā)現(xiàn)很多開發(fā)者在使用thinkphp5.*的時(shí)候不明白Db和模型的正確使用姿勢(shì),尤其是在5.1版本里面,如果你沒有使用下面的正確姿勢(shì),有很大可能性會(huì)踩坑。

Db的正確姿勢(shì)

下面是官方推薦的Db類用法(也就是每次都是靜態(tài)方法調(diào)用)

//?查詢單個(gè)數(shù)據(jù) Db::name('user')->where('id',?1)->find(); //?查詢多個(gè)數(shù)據(jù) Db::name('user')->where('id',?'>',?1)->select(); //?寫入新的數(shù)據(jù) Db::name('user')->insert(['name'?=>?'張三']); //?更新數(shù)據(jù) Db::name('user')->where('id',?1)->update(['name'?=>?'李四']); //?刪除數(shù)據(jù) Db::name('user')->delete(1);

很多開發(fā)者為了簡化代碼,喜歡使用下面的代碼。

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

但是,永遠(yuǎn)不要在5.1中使用下面的代碼!

//?錯(cuò)誤的用法  $user?=?Db::name('user'); //?查詢單個(gè)數(shù)據(jù) $user->where('id',?1)->find(); //?查詢多個(gè)數(shù)據(jù) $user->where('id',?'>',?1)->select(); //?寫入新的數(shù)據(jù) $user->insert(['name'?=>?'張三']); //?更新數(shù)據(jù) $user->update(['name'?=>?'李四']); //?刪除數(shù)據(jù) $user->delete(1);

即便是使用助手函數(shù)仍然不建議!

//?仍然是錯(cuò)誤的用法  //?查詢單個(gè)數(shù)據(jù) db('user')->where('id',?1)->find(); //?查詢多個(gè)數(shù)據(jù) db('user')->where('id',?'>',?1)->select(); //?寫入新的數(shù)據(jù) db('user')->insert(['name'?=>?'張三']); //?更新數(shù)據(jù) db('user')->update(['name'?=>?'李四']); //?刪除數(shù)據(jù) db('user')->delete(1);

很多開發(fā)者可能會(huì)奇怪,為什么是錯(cuò)誤的用法呢?我使用的結(jié)果明明都沒問題啊?這只是說明你還沒踩坑罷了。

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

$user?=?Db::name('user'); //?查詢分?jǐn)?shù)大于80分的用戶總數(shù) $count?=?$user->where('score',?'>',?80)->count(); //?查詢分?jǐn)?shù)大于80分的用戶數(shù)據(jù) $user->select();

看到這里你應(yīng)該明白了,當(dāng)你使用的是同一個(gè)數(shù)據(jù)庫查詢對(duì)象實(shí)例的話,查詢條件是始終會(huì)保留的(也就是會(huì)導(dǎo)致后面的查詢條件錯(cuò)亂),而如果你使用助手函數(shù)或者手動(dòng)實(shí)例化后多次操作都是相同的對(duì)象實(shí)例,除非你像下面一樣手動(dòng)清除。

$user?=?Db::name('user'); //?查詢分?jǐn)?shù)大于80分的用戶總數(shù) $count?=?$user->where('score',?'>',?80)->count(); //?清除查詢條件(但不包括排序或者字段等信息) $user->removeOption('where'); //?查詢所有用戶數(shù)據(jù)?并按分?jǐn)?shù)倒序排列? $user->order('score',?'desc')->select(); //?清除所有查詢條件 $user->removeOption(); //?查詢分?jǐn)?shù)等于100的用戶 $user->where('score',?100)->select();

最佳實(shí)踐:每次使用全新的Db靜態(tài)查詢

模型的正確姿勢(shì)

模型的設(shè)計(jì)其實(shí)和Db一樣,基本上不需要手動(dòng)進(jìn)行實(shí)例化。

//?寫入新的數(shù)據(jù) $user?=?User::create(['name'?=>?'張三']); //?更新數(shù)據(jù) $user->update(['name'?=>?'李四']);  //?查詢單個(gè)數(shù)據(jù) $user?=?User::get(1); //?刪除當(dāng)前模型數(shù)據(jù) $user->delete();

上面的代碼中,我們沒有使用任何的實(shí)例化代碼,都是使用靜態(tài)方法操作。模型的實(shí)例化工作是由系統(tǒng)在查詢或者寫入數(shù)據(jù)的時(shí)候自動(dòng)完成的。如果你自己手動(dòng)實(shí)例化模型的話,會(huì)造成模型的重復(fù)實(shí)例化開銷。

不建議的用法:

$user?=?new?User; //?寫入新的數(shù)據(jù) $user->name?=?'張三'; $user->save();
$user?=?new?User; $user->find(1); echo?$user->name;

建議用法:

//?寫入新的數(shù)據(jù) User::create(['name'?=>?'張三']); $user?=?User::get(1); echo?$user->name;

所以,請(qǐng)不要手動(dòng)實(shí)例化模型,也不建議使用model助手函數(shù)。

最佳實(shí)踐:模型查詢和創(chuàng)建都使用靜態(tài)方法

現(xiàn)在,你明白Db類和模型使用的正確姿勢(shì)了么?

PHP中文網(wǎng),有大量免費(fèi)的ThinkPHP入門教程,歡迎大家學(xué)習(xí)!

本文轉(zhuǎn)自:https://blog.thinkphp.cn/810719

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享