模型的主要功能包括数据处理和业务逻辑,而这些都离不开数据的CURD操作,因此我们首先来谈下数据的CURD操作,在掌握了数据库Db类的用法后,模型的CURD操作就会很容易理解,因为本质上模型的CURD操作最终调用的还是Db类的操作,区别在于使用了ActiveRecord模式和单独做了一层封装而已,我们来看下两种方式CURD操作用法的简单对比(其中模型会给出动态和静态两种实现方法,分别对应不同的场景)。
delete方法没有任何参数,因此只能删除当前实例的模型数据,destroy方法支持删除指定主键或者查询条件的数据,例如:
早期版本的destroy方法如果传入空值,会删除数据表的所有数据,该问题已经在V5.0.9版本得到修正(不会执行任何删除)。
在模型的删除功能设计的时候,应该尽量用软删除替代实际的删除,一方面是为了避免数据丢失,一方面也是为了性能考虑(数据库的删除操作会导致重建索引,数据量越大影响越大),关于软删除的用法我们放到高级用法中描述。
删除操作用法小结:
方法 | 作用 | 返回值 |
delete | 删除当前数据 | 影响的记录数 |
destroy | 删除指定数据(静态) | 影响的记录数 |
现在我们已经掌握了模型的基本CURD操作,我们来总结下方法区别:
用法 | Db类 | 模型(动态) | 模型(静态) |
创建 | insert | save | create |
更新 | update | save | update |
读取单个 | find | find | get |
读取多个 | select | select | all |
删除 | delete | delete | destroy |
除了模型自己的方法操作外,还可以调用Db类的所有查询方法,也就是说Db类的CURD操作方法都可以在模型类中被调用。
不知道大家注意到一个细节没,模型的创建操作和更新操作的动态方法都是save,而并没区分。其实对于对象实例来说,所有的数据变化都只需要有一个保存行为,至于是创建还是更新那是数据库内部的事情,对不起模型对象不关心。模型会根据当前的场景自动判断是创建还是更新操作。
然后要注意几个注意事项:
模型类可以直接调用Db类的所有方法;
模型类和Db类的查询返回类型是完全不同的,即便是调用同一个方法查询;
模型类封装的静态方法本质上还是调用的动态方法,只是为了方便不同的需求场景;
模型对象的查询操作尽量使用静态方法调用;
閱讀更多 行家匯 的文章