模型(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,负责项目中的“数据+ 业务逻辑”. 模型是独立于控制器和视图。通过模型可以避免代码重复以及易于扩展。模型不是必需的,可以根据自己的业务逻辑进行使用。
自定义模型
模型存放在模块下的model目录下,模型为一个类,一个模型类就是一个php文件。
模型类名为:模型名称Model(首字母大写)。
模型文件名为:模型名称Model.php(首字母大写)。
命名空间为:app\模块\model。
所有控模型都继承于公共模型startmvc\lib\Model。
// app/Home/model/TestModel.php
namespace app\home\model;
use startmvc\lib\Model;
class TestModel extends Model{
protected $table='Test';
function say(){
echo 'hi';
}
}
调用自定义模型
在控制器、模型和视图中,可以使用$this->model()方法来实例化一个模型,或者在控制器中通过依赖注入实例化一个模型。
// 通过方法载入模型
namespace app\home\controller;
use startmvc\lib\Controller;
class IndexController extends Controller {
function indexAction(){
$test = $this->model('Test');
$test = $this->model('Test', 'Home');
// $this->model()的第二个参数是模块名,可以实现跨模块共享模型
$test->say();
// 或者
$this->model('Test')->say();
//如果一个模型实例只用一次,可以用链式操作
}
}
公共模型的方法
为了减少代码的重复量,公共模型中内置了两个方法,可以在自定义模型、控制器以及视图文件中调用。
调用单条数据
find($field="*",$where='',$getsql=false)
$field, 需要调用的字段,比如id,title,content,当为*或空时,调用全部字段。
$where,条件语句,$where必须为数组或数字,比如:
['id'=>2,'status'=>1] 调用id为2并且status为1的一条数据
find('*','id=5') 调用id为5的数据
$getsql=true时返回sql语句
调用多条数据
findAll($field="*",$where=[],$order='',$limit='',$getsql=false)
$field, 方法同find
$where,条件语句,方法同find
$order, 结果集排序,比如"id","id desc",'rand()'
$limit,调用条数,比如“10”,"10,20"
$getsql, 是否返回sql语句
更新数据
update($data,$where=[])
$data,需要更新的数据,数组类型;
$where,条件语句,$where必须为数组
return 结果返回影响条数(int)
更新数据
delete($where='')
$where,条件语句,$where可为数组、数字或空,当$where为数字时,默认删除id=数字这条数据,当$where 为空时,会执行TRUNCATE(清除)方法
return 结果返回影响条数(int)
在自定义的模型调用公共模型
自定义test模型 TestModel.php调用公共模型的方法样式如下
$this->find('*','id=1');
Model::find('*','id=1');
$this->model('test')->find('*','id=1');
self::find('*','id=1');
parent::find('*','id=1');
$this->update(['name'=>'小红'],['id'=>2]);
$this->delete(['id'=>5]);
$this->delete(5);
$this->delete();
说明在自定义模型中务必定义一个变量$table,变量中的值通常为表名
<?php
namespace app\home\model;
use startmvc\lib\Model;
class TestModel extends Model{
protected $table='Test';//表名
function getData(){
//return $this->find('*','age>18');
//return Model::find('*','age>18');
//return $this->model('test')->find('*','age>18');
//return self::find('*','age>18');
return parent::find('*','age>18');
}
}
在控制器、视图中调用公共模型
在控制器或视频中调用公共模型使用 $this->model(),比如:
$this->model('test')->find('*','id=1');
$this->model('test')->findAll('*',['name'=>'小明']);
$this->model('test')->update(['title'=>'startmvc框架是轻量的','update_time'=>time()],['id'=>'6']);
$this->model('test')->delete(8);
上面的test为模型名