ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 定义一个基础模型 * 模型文件放在模块下的`model`目录内(事实上,可以放在任何位置),并且文件名以首字母大写的驼峰命名+`Model`。 ~~~php <?php namespace module\index\model; class PeopleModel { public $head; public $hand; public $foot; public function buildPeople() { return $this->head . $this->hand . $this->foot; } } ~~~ 如上,我定义了一个最简单的模型`People`。 ### 定义一个数据库模型 当我的一个模型和数据库关联,我定义的模型就可以继承`lying\db\ActiveRecord`: ~~~php <?php namespace module\index\model; use lying\db\ActiveRecord; class UserModel extends ActiveRecord { } ~~~ 如上,我定义了一个模型,模型默认关联`\Lying::$maker->db`(参见[db组件](db.md))中的表`user`。 如果你的模型为`UserLogModel`,那么你默认对应的表为`user_log`。 再或者,想自定义关联的数据库和关联的表,你可以如下定义: ~~~php <?php namespace module\index\model; use lying\db\ActiveRecord; class UserModel extends ActiveRecord { /** * 设置数据库连接 * @return \lying\db\Connection */ public static function db() { return \Lying::$maker->db2; } /** * 设置模型对应的表名 * @return string */ public static function table() { return 'myuser'; } } ~~~ #### 数据库模型初始化 你可以在模型实例化的时候执行一些操作,因为数据库模型继承服务类基类,所以不能定义构造函数,但是你可以用重写`init()`方法来实现初始化操作: ~~~php <?php namespace module\index\model; use lying\db\ActiveRecord; class UserModel extends ActiveRecord { public function init() { //对象实例化的时候进行你的一些操作 } } ~~~ ### 数据库模型操作 数据库的一条记录对应一个数据库模型实例,数据库的字段对应模型实例的属性。 #### 查询 ~~~php $user = UserModel::find()->where(['id'=>1])->one(); $user = UserModel::find()->where(['<', 'id', '10'])->all(); ~~~ 如上,`UserModel::find()`返回一个`lying\db\ActiveQuery`实例,操作方法和`lying\db\Query`一致(参见[查询生成器](query.md)),但是默认已经调用`from()`方法,设置了查询的表为当前模型对应的表,所以不用再次调用`from`。`one()`方法返回一个`UserModel`实例,如果查询的数据库记录存在的话。`all()`方法返回所有满足查询条件的`UserModel`数组。 ~~~php $user = UserModel::findOne(['id'=>1]); $user = UseModelr::findAll(['<', 'id', 10]); ~~~ 如上,`findOne()`查询满足条件的一个`UserModel`实例,参数为数组查询条件。`findAll()`的参数可以省略,或者为数组的查询条件,并且返回所有满足查询条件的`User`实例数组。 > 通过以上查询出来的`UserModel`实例为旧记录,如果`$user = new UserModel();`,则`$user`为新记录。 #### 更新记录 如果你查询出了一条记录,此时这条记录为旧记录,那么你可以直接对其进行更改,然后调用`save()`方法进行更新记录: ~~~php $user = UserModel::findOne(['id'=>1]); $user->name = 'lying'; $user->sex = 1; $user->save(); //或者 UserModel::updateAll(['id'=>1], ['sex'=>'0']); ~~~ 也可以用`load`函数来装载数据: ~~~php $user = UserModel::findOne(['id'=>1]); $user->load(['name'=>'lying']); $user->save(); ~~~ #### 插入记录 你想要在`UseModelr`表插入一条记录: ~~~php $user = new UserModel(); $user->name = 'lying'; $user->money = 100; $user->save(); ~~~ 也可以用`load`函数来装载数据: ~~~php $user = new UserModel(); $user->load(['name'=>'lying']); $user->save(); ~~~ > `save()`方法能判断你的当前对象是否为新记录,如果为新记录就执行插入操作,旧记录执行更新操作。需要注意的是,旧记录查询结果必须包含主键,否则更新失败,save()方法返回0。 #### 删除记录 如果你的记录为旧记录,那么你可以这样删除这条记录: ~~~php $user = UserModel::findOne(1); $user->delete(); //你也可以这样: UserModel::deleteAll(['id'=>1]); ~~~ #### 其他操作 判断模型是否存在某个字段: ~~~php $user = new UserModel(); $user->load(['name'=>'lying', 'sex'=>null]); $user->exists('name'); //true $user->exists('sex'); //true $user->exists('addr'); //false ~~~ ### 数据库模型返回值 > 一般执行出错都会抛出异常,执行失败返回false,成功返回更改的行数。具体请看代码的注释。