[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,成功返回更改的行数。具体请看代码的注释。
- 序言
- 更新日志
- 安装
- 规范
- 常量
- 配置
- 自动加载
- MVC
- 模块
- 控制器
- 模型
- 视图
- php原生模板
- 模板引擎
- 变量输出
- 模板注释
- 模板继承
- 模板引用
- 流程控制
- 原样输出
- 服务组件
- Hook组件
- Request组件
- Router组件
- Cookie组件
- Encrypter组件
- Dispatch组件
- Response组件
- View组件
- Session组件
- Helper组件
- 数据分页
- 数据验证
- Logger组件
- Cache组件
- Redis组件
- Connection组件
- 执行sql语句
- 查询生成器
- 查询方法详解
- Schema
- Captcha组件
- CLI
- CLI工具
- 事件
- 类事件
- 实例事件
- 全局事件
- 助手函数
- 扩展
- 异常
- 部署
- Apache
- Nginx
- IIS
- 虚拟主机