Scope 功能的改進

2022-07-03 12:18:09 字數 1453 閱讀 4783

前段時間發表了一篇文章 物件導向的一小步:新增 activerecord 的 scope 功能 提到一種更加友好的方式做資料庫查詢。經小夥伴的建議,在滿足同樣條件下,可以有更為簡潔的封裝方法。

這需要用到過載activequery方法,在通過gii建資料模型model時,可以勾選"generate activequery"這麼一項自動生成。

例如,在生成student model時,可以自動生成studentquery

class studentsquery extends \yii\db\activequery

** @return tbstudents|array

*/public function all($db = null)

/***

** @return tbstudents|array|null

*/public function one($db = null)

//預設篩選已經審核通過的記錄,當然,也可以自己定義$status

public function checked($status = 1)

}

checked()方法裡面有一條where條件,也可以新增多條。總之,這個checked方法可以隨你定義, 封裝一類現實應用常用的條件組合。

這樣,我們便可以這樣來查詢:

student::find()->checked()->where(...)->all();
那又如何滿足checked方法的靜態呼叫呢?

student::checked()->where(...)->all();
這還得在model裡面過載__callstatic()方法。這個過載可寫在乙個如basemodel的公共方法裡面,以便大家呼叫。

public static function __callstatic($name, $arguments)

也更為簡潔,同時也是一種透明操作。在studentquery中沒有定義對應方法或者傳參錯誤都會導致報錯。

那麼這是如何做到的?

因為在student裡面有這麼一段:

public static function find()

可見在__callstatic中返回的static::find()其實就是乙個studentquery的乙個例項,然後在這個例項中去尋找checked方法。繞了個小圈子,重新回到了studentquery。道理非常簡單。

現在我們同樣可以實現兩種友好的查詢了:

student::find()->checked()->where(...)->all();

student::checked(2)->where(...)->all()

對**簡潔性和透明性的要求比較高的小夥伴,可以採用這種封裝。

改進的陣列功能(十)

改進的陣列功能 array.from 方法可以接受可迭代物件或類陣列物件作為第乙個引數,最終返回乙個陣列 array.from 也是通過this來確定返回陣列的型別的 function dosomething 為所有陣列新增新的方法 find 方法和findindex 方法可以協助開發者在陣列中查詢...

盼望CSDN改進的功能

第一 csdn 需要穩定,速度要加快 第二,服務要到位,經過這次禁止上傳的事情後,讓人更加知道提前做好準備 第三,資料備份,這個是csdn 一直都沒有的功能,備份兩方面 乙個是針對資料庫裡,另乙個針對自己,希望可以讓自己部落格的文章匯出chm 或者pdf這種格式方便自己儲存。經過部落格大巴這件事情 ...

Scope的作用域

scope描述的是sring容器如何新建bean的例項。spring的scope有以下幾種,通過 scope註解來實現 1 scope singleton 乙個spring容器中只有乙個bean的例項,為spring的預設配置,全容器共享乙個例項。這個單一例項會被儲存到單例快取中,並且所有針對該be...