模型类除了自己的操作方法外,**还可以调用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方法如果传入索引数组,即表示查询条件,如果是不带索引的数组,表示查询多个主键。