当前位置: 首页 > 文档资料 > DoitPHP 帮助文档 >

4.3 Model应用

优质
小牛编辑
132浏览
2023-12-01

模型(Model)是 MVC里的M,一般用于处理数据相关的业务逻辑。DoitPHP的Model基类提供了关系数据库(mysql、oracle、postgresql、sqlite、mssql等)操作的类方法。下面将Model文件的应用介绍一下,前面文档:基础知识->开发规范中提到了Model文件的创建规则,在此无需赘述。创建Model文件时,建议使用DoitPHP Tools,简便快捷。举个例子:创建类 postMode.php。

namespace models;

use doitphp\core\Model;

class postModel extends Model {

}

如果所要创建的Model文件,没有数据库操作业务(无需操作数据库),则无需继承Model基类,反之则必须继承。原因很简单:Model基类中已经封装了N多种数据库操作类方法,如果不继承,怎么使用这些有用的类方法呢?Model文件如有数据库操作,一般的套路就是:一个数据表对应一个Model文件(一个Model类绑定一个数据表,对所绑定的数据表进行增、删、改、查等操作)。若有数据表操作,自然要用到数据表字段信息(获取数据表主键、数据表字段等),此时需要对自定义数据表信息的类方法进行重定义。依然使用上面postModel为例,假设postModel对应的数据表名为:posts, 其字段为 post_id,post_title,post_content,post_time,其中post_id为主键。则实例代码如下:

/**
* 定义本Model Class所绑定数据表名称
*
* @access protected
* @return array
*/
protected function _tableName() {
return 'posts';
}

/**
* 定义本Model Class所绑定数据表主键
*
* @access protected
* @return array
*/
protected function _primaryKey() {
return 'post_id';
}

/**
* 定义本Model Class所绑定数据表字段信息
*
* @access protected
* @return array
*/
protected function _tableFields() {
return array('post_id','post_title','post_content','post_time');
}

如果没有对上面的类方法进行重定义,Model文件的业务逻辑不会受影响,但执行数据库的写操作时,程序会自动查询数据表字段信息(第一次查询后将其字段信息生成缓存文件,下次使用时直接调用缓存),势必影响程序的执行效率。如果没有对tableName()进行重定义,在执行数据库操作时,则默认所绑定的数据表名称为当前Model文件名(如:postModel对应的数据表名为post),这样Model文件的命名就会受限。所以对上面的实例代码中的类方法进行重定义是上上策。若使用DoitPHP Tools生成Model文件时, 则自动将上面的类方法进行了重定义。继续上面的例子,postModel如何在Controller文件中调用呢?首先对model进行实例化。

$postModel = $this->model('post');

如果查询post数据表的所有数据,操作如下:

$data = $postModel->findAll();

如果要查看$data的数据,则:

$this->dump($data);

上面的例子,用到类方法:findAll(),这就是在Model类中封装的类方法。下面将Model基类所提供的类方法及使用说明详细地讲述一下:

执行SQL语句的类方法:

1、query($sql, $params = null)

执行的SQL查询语句。本类方法需要和fetchRow()或fetchAll()合用来获取数据。若想获取单行数据用fetchRow(),获取多行数据则用fetchAll()。

参数说明:
$sql : 所要执行的SQL语句
$params : 待转义的数据。注:本参数支持字符串及数组

举例说明:

例一、
$sql = "select * from posts post_id<15 order by post_id desc limit 0, 10";
$data = $postModel->query($sql)->fetchAll();
$this->dump($data);

例二、
$sql = "select * from posts where post_title=? order by post_id desc limit 0, 10";
$data = $postModel->query($sql, 'doitphp')->fetchRow();
$this->dump($data);

例三、
$sql = "select * from posts where post_title=? and post_time >? order by post_id desc
limit 0, 10";
$postModel->query($sql, array('doitphp', '2010-5-4'))->fetchAll();
或:
$postModel->query($sql, 'doitphp', '2010-5-4')->fetchAll();

例四、
$sql = "show fields from posts";
$data = $postModel->query($sql)->fetchAll();
$this->dump($data);

2、execute($sql, $params = null)

执行数据库写操作的SQL语句(无需返回信息)。如:更改、删除、添加数据信息(即:用于执行非查询SQL语句)。

参数说明:
$sql : 所要执行的SQL语句
$params : 待转义的数据。注:本参数支持字符串及数组

举例说明:

例一、
$sql = "update posts set post_title='lucky tommy every day' where id=5";
$postModel->execute($sql);

例二、 $sql = "update posts set post_title=? where id=5";
$postModel->execute($sql, 'lucky tommy every day');

例三、
$sql = "update posts set post_title=? where id=?";
$postModel->execute($sql, array('lucky tommy every day', 5));
或:
$postModel->execute($sql, 'lucky tommy every day', 5);

注:在使用上面这两个类方法执行sql语句时,有种情况就是:有数据表前缀时,执行的SQL语句需要怎么写?DoitPHP框架在处理这种情况时,使用一个关键字"#__"。 当所执行的sql语句中含有这个关键字时,DoitPHP框架则自动将其替换为数据表前缀。如:"select * from #__posts where post_id>5201314"。

主键查询:

1、find($id)

主键查询:获取一行或多行主键查询的数据。 注:默认主键为数据表的物理主键。

参数说明:
$id : 所要查询的主键值。注:本参数可以为数组。当为数组时,返回多行数据

举例说明:

例一、
$data = $postModel->find(23);
$this->dump($data);

例二、查看主键为23的字段:post_title的数据。
$data = $postModel->fields('post_title')->find(23);
$this->dump($data);
//注:若要实现查询数据中某字段信息,请联合下文中介绍的fields()使用。

例三、
$data = $postModel->fields('post_title', 'post_time')->find(23);
$this->dump($data);

例四、
$data = $postModel->find(array(21,23,27));
$this->dump($data);

例五、
$data = $postModel->fields('post_id', 'post_title')->find(array(21,23,27));
$this->dump($data);

2、findAll()

主键查询:获取数据表的全部数据信息。 以主键为中心排序,获取数据表全部数据信息。注:如果数据表数据量较大时,慎用此函数(类方法),以免数据表数据量过大,造成数据库服务器内存溢出,甚至服务器宕机。

参数说明:
参数为空

举例说明:

例一、
$data = $postModel->findALL();
$this->dump($data);

例二、只查看数据表字段:post_id及post_title的数据
$data = $postModel->fields('post_id', 'post_title')->findALL();
$this->dump($data);

例三、要求相比上面例二更多一些:post_id倒序排列且只显示前10条数据
$data = $postModel->fields('post_id', 'post_title')->order('post_id desc')
->limit(0, 10)->findALL();
$this->dump($data);

注:若实现查询数据的数据表字段筛选、排列组合等,要与下文中所讲的 fields()、order()、limit()或page_limit()等类方法联合使用。

根据条件查询:

1、getOne()

获取查询数据的单选数据。 根据查询条件,获取单行数据,返回数据为数组型,索引为数据表字段名。注:本类方法需要与下文中的where()、fields()、order()、limit()、page_limit()联合使用来实现查询条件,排序条件等条件的数据查询。

参数说明:
参数为空

举例说明:

例一、
$data = $postModel->fields('post_id', 'post_title'))
->where('post_title=?', 'lucy tommy 365')->order('post_id desc')->getOne();

$this->dump($data);

2、getAll()

获取查询数据的全部数据。 根据查询条件,获取多行数据。 注:本类方法需要与下文中的where()、fields()、order()、limit()、page_limit()联合使用来实现查询条件,排序条件等条件的数据查询。

参数说明:
参数为空

例一、
$data = $postModel->where('post_title=?', 'lucy tommy 365')->getAll();

$this->dump($data);

例二、多条件查询
$data = $postModel->fields('post_id', 'post_title')
->where('post_title=?', 'lucy tommy 365')->order('post_id desc')
->limit(0, 10)->getAll();

$this->dump($data);

数据表的UID操作(增加、删除、更改):

1、insert($data, $isReturnId = false)

数据表写入操作

参数说明:
$data : 所要写入的数据内容。注:数据必须为数组
$isReturnId : 是否返回数据为:last insert id

举例说明:

例一、
$insertArray = array('post_title'=>'good luck every day', 'post_content'=>'略150字');
$postModel->insert($insertArray);

例二、
$insertArray = array('post_title'=>'返回insert id', 'post_content'=>'省略350字');
$postId = $postModel->insert($insertArray, true);

2、replace($data)

数据表数据替换操作

参数说明:

$data : 所要替换的数据内容。注:数据必须为数组

举例说明:

例一、
$replaceArray = array('post_id'=>5, 'post_title'=>'新年快乐', 'post_content'=>'略');
$postModel->replace($replaceArray);

3、update($data)

数据表更改操作,注:数据更改条件需要联合使用where()来实现。

参数说明:
$data : 所要更改的数据内容

举例说明:

例一、
$updateArray = array('post_title'=>'恭喜发财', 'post_content'=>'省略150字');
$postModel->where('post_id=2016')->update($updateArray);

例二、
$updateArray = array('post_title'=>'恭喜发财', 'post_content'=>'省略150字');
$postModel->where('post_tile=?', '圣诞快乐')->update($updateArray);

例三、
$updateArray = array('post_title'=>'恭喜发财', 'post_content'=>'省略150字');
$postModel->where('post_tile=? and post_id>?', '圣诞快乐', 175)->update($updateArray);

4、delete()

数据表删除操作,注:删除条件需要联合使用where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->where('post_id=2016')->delete();

例二、
$postModel->where('post_title=?', '欢庆2021新年')->delete();

例三、
$postModel->where('post_title=? or post_title=?', '欢庆2021新年', '新春快乐')->delete();

组装SQL语句:

1、where($where, $value = null)

组装SQL语句的WHERE语句。 用于getOne()、getAll()等类方法的条件查询

参数说明:
$where : Where的条件
$value : 待转义的数值,当多条件查询时本参数可为数组。

例一、
$postModel->where('post_title=?', '2017年')->getAll();

例二、
$postModel->where('post_id!=? and post_title=?', '44', '恭喜发财')->getAll();

例三、
$postModel->where('post_title=?', '欢庆2021新年')->delete();

2、order($orderDesc)

组装SQL语句排序(ORDER BY)语句。 用于getAll()的数据排行。

参数说明:
$orderDesc : 排序条件。注:本参数支持数组

举例说明:

例一、
$postModel->where('post_title=?', '2021')->where('post_id>2020')
->order('post_id desc')->getAll();

3、fields($fieldName)

组装SQL语句的查询字段。

参数说明:
$fieldName : 所要查询的数据表字段信息。注:本参数可为数组

举例说明:

例一、
$postModel->fields('post_id', 'post_title')
->where('post_title=?', '2021年')->getAll();

例二、
$postModel->fields(array('post_id', 'post_title'))
->where('post_title=?', '2021年')->getAll();

4、limit($offset, $listCount = null)

组装SQL语句LIMIT语句。 limit(10,20)用于处理LIMIT 10, 20之类的SQL语句部分。

参数说明:
$offset:启始id。注:参数为整形
$listCount:显示的行数

举例说明:

例一、
$postModel->where('post_id>2016')->limit(0, 20)->getAll();

5、pageLimit($page, $listCount)

组装SQL语句的LIMIT语句。 注:本方法与上面的limit()功能相类,区别在于:本方法便于分页,参数不同。

参数说明:
$page : 当前的页数
$listCount : 每页显示的数据行数

举例说明:

例一、
$postModel->where('post_id>2016')->pageLimit(5, 10)->getAll();

注:以上这些所谓的SQL组装类方法并非组装完整的SQL语句,仅供getOne()、getAll()、find()、findAll()、update()、delete()以及下文中的count()、max()、min()、distinct(),sum()、avg()这些类方法调用。

常用的数据库函数操作:

1、count()

获取查询信息的数据总行数,返回数据类型为int。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_id')->where('post_title=?', '2017年')->count();

2、distinct()

获取查询信息的某数据表字段的唯一值的数据。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_title')->where('post_title=?', '2017年')->distinct();

3、max()

获取查询信息某数据表字段的最大值。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_id')->where('post_id>2016')->max();

4、min()

获取查询信息某数据表字段的最小值。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_id')->where('post_id<2017')->min();

5、sum()

获取查询信息某数据表字段的数据和。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_id')->where('post_id<100')->sum();

6、avg()

获取查询信息某数据表字段的数据的平均值。注:查询字段和查询条件需要联合使用fields(),where()来实现。

参数说明:
参数为空

举例说明:

例一、
$postModel->fields('post_id')->where('post_id<100')->avg();

事务处理操作:

1、startTrans()

事务处理:开启事务处理。

参数说明:
参数为空

举例说明:

例一、
$postModel->startTrans();

2、commit()

事务处理:提交事务处理。

参数说明:
参数为空

举例说明:

例一、
$postModel->commit();

3、rollback()

事务处理:事务回滚。

参数说明:
参数为空

举例说明:

例一、
$postModel->rollback();

其它类方法:

1、getLastInsertId()

获取数据表写入时的最新的insert id。通常用于前文insert()操作后,获取最新的id。

参数说明:
参数为空

举例说明:

例一、
$insertArray = array('post_title'=>'略', 'post_content'=>'省略60字');
$postModel->insert($insertArray);
$postModel->getLastInsertId();

2、quoteInto($value)

字符串转义函数。SQL语句指令安全过滤,用于字符转义。一般情况下很少用到。

参数说明:
$value : 所要转义的字符或字符串。注:参数支持数组

举例说明:

例一、
$value = $postModel->quoteInto('年味浓');
$postModel->where('post_title=' . $value)->getAll();

3、getConnection($adapter = true)

获取当前数据库连接的实例化对象。 使用类方法,可以实现对原生PDO所提供的函数的调用。

参数说明:
$adapter : 是否为主数据库。true:主数据库/false:从数据库

举例说明:

例一、
$dbConnection = $postModel->getConnection();
$dbConnection->getLastError();

4、createSql()

创建SQL查询语句组装实例化对象。

参数说明:
参数为空

举例说明:

$sqlObj = $postModel->getConnection();
$list = $sqlObj->from('posts', 'post_title')->where('post_id<2017')
->query()->fetchAll();
$this->dump($list);

5、setErrorInfo($message)

设置错误信息。注:只限Model文件中使用!

参数说明:
$message: 错误信息

使用举例:

例一、
$this->setErrorInfo('所添加的数据已存在');

6、getErrorInfo()

获取当前模型的错误信息。

参数说明:
参数为空

举例说明:

例一、
$errorInfo = $postModel->getErrorInfo();

$this->ajax(false, $errorInfo);

7、getTableName()

获取当前模型(Model)文件所绑定(对应)的数据表的名称。 注:若数据表有前缀($prefix)时,系统将自动加上数据表前缀。

参数说明:
参数为空

举例说明:

例一、
$sql = "select * form " . $postModel->getTableName() . " where post_id=2017";
$postModel->query($sql)->fetchRow();

8、setTableName($tableName)

设置当前模型(Model)文件所绑定(对应)的数据表的名称。 注:数据表名称不含数据表前缀($prefix)。

参数说明:
$tableName : 数据表名称。注:不含数据表前缀

举例说明:

例一、
$model = Model::getInstance();

$model->setTableName('posts');
$data = $model->findAll();

$this->dump($data);

9、getTablePrefix()

获取当前模型(Model)文件所对应的数据表前缀。

参数说明:
参数为空

举例说明:

例一、
$sql = "select * form " . $postModel->getTablePrefix() . "posts where post_id=2017";
$postModel->query($sql)->fetchRow();

10、model($modelName)

实例化模型类。专用于在model文件中,用来自定义业务逻辑时,实例化其它的模型类。

参数说明:
$modelName : 所要实例化的模型类的名称

11、getConfig($fileName)

静态获取配置文件的内容,专用于在model文件中。 注:此配置文件非数据库连接配置文件,而是其它用途的配置文件。详细信息参见Controller Class中的类方法getConfig()。

参数说明:
$fileName : 配置文件的名称。注:不含有“.php”后缀

12、dump($data, $type = false)

调试类方法:优雅输出print_r()函数所要输出的内容,专用于在model文件中。 注:详细信息参见Controller Class中的类方法dump()。

参数说明:
$data : 所要输出的数据
$type : 输出的信息是否含有数据类型信息。true:支持/false:不支持