💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
模型类除了自己的操作方法外,**还可以调用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方法如果传入索引数组,即表示查询条件,如果是不带索引的数组,表示查询多个主键。