模型類除了自己的操作方法外,**還可以調用Db類的所有查詢方法**,也就是說Db類的CURD操作方法都可以在模型類中被調用。
不知道大家注意到一個細節沒,**模型的創建操作和更新操作的動態方法都是save**,而并沒區分。其實對于對象實例來說,所有的數據變化都只需要有一個保存行為,至于是創建還是更新那是數據庫內部的事情,對不起模型對象不關心。模型會根據當前的場景自動判斷是創建還是更新操作。
然后要注意幾個注意事項:
* 模型類可以直接調用Db類的所有方法;
* 模型類和Db類的查詢返回類型是完全不同的,即便是調用同一個方法查詢;
* 模型類封裝的靜態方法本質上還是調用的動態方法,只是為了方便不同的需求場景;
* 模型對象的查詢操作盡量使用靜態方法調用;
#### 使用查詢構造器
之前我們已經知道了,Db類的所有方法都可以在模型中調用,因此查詢構造器的用法在模型類中沒有變化,并且還做了一些增強來支持模型的CURD封裝方法。
下面舉幾個例子說明,首先是直接使用查詢類提供的鏈式方法完成查詢:
~~~
$users = User::where('name', 'like', '%think')
->where('id', 'between', [1, 5])
->order('id desc')
->limit(5)
->select();
~~~
所有的鏈式方法都可以直接被模型類靜態調用,而且一樣不分先后次序,你只要掌握了數據庫的查詢構造器用法,就能掌握模型的查詢用法,而且模型類不需要調用table方法來指定數據表名稱,因為模型已經有自己的對應數據表規則,從這一點來說,模型的查詢操作應該比Db類的查詢操作用法簡單^_^。
模型類提供的all方法除了上面提過的根據主鍵值查詢之外,還支持使用閉包查詢,閉包方法中可以使用任何的查詢類方法(但不需要在閉包里面調用查詢),針對上面的查詢我們可以用閉包方式改造如下:
~~~
$users = User::all(function ($query) {
$query->where('name', 'like', '%think')
->where('id', 'between', [1, 5])
->order('id desc')
->limit(5);
});
~~~
閉包只有一個參數,就是查詢對象。
如果你的查詢參數都是以查詢條件為主的話,可以給all方法直接傳入數組查詢條件即可:
~~~
$users = User::all([
'name' => 'thinkphp',
'id' => ['>', 1],
]);
~~~
all方法如果傳入索引數組,即表示查詢條件,如果是不帶索引的數組,表示查詢多個主鍵。