模型定义:
模型类并非必须定义,只有当存在独立的业务逻辑或者属性的时候才需要定义。
模型类通常需要继承系统的\Think\Model类或其子类:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
}
模型类的作用:
多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表。
创建模型类
注意:注意trueTableName
需要完整的表名定义。
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
//1:
//think_categories表,而我们定义的模型类名称是CategoryModel
//设置tableName属性来改变默认的规则(假设我们已经在配置文件里面定义了DB_PREFIX 为 think_
protected $tableName = 'categories';
//2:
//如果数据表是 top_category;那么我们只需要设置数据表前缀即可:
protected $tablePrefix = 'top_';
//3:
//数据表直接就是category,而没有前缀,则可以设置tablePrefix为空字符串。
//没有表前缀的情况必须设置,否则会获取当前配置文件中的 DB_PREFIX。
protected $tablePrefix = '';
//4:
//需要操作的数据表是top_categories,这个时候我们就需要定义 trueTableName 属性
protected $trueTableName = 'top_categories';
//5:
//用于操作当前数据库以外的数据表(top.top_categories)
protected $trueTableName = 'top_categories';
protected $dbName = 'top';
}
模型实例化:(D和M函数)
区别:
M(“表名”):实例化系统父类model ,命名空间为:Think\Model
D(“自定义类名”):实例化我们自定义类名 , 命名空间为:Admin\Model\类名Model
注意:D方法功能更强大,因为后面我会在自定义类模型中添加很多方法和设置,这时候只能通过实例化D()去调用。
如果D方法没有找到定义的模型类,则会自动调用M方法
详解:
D方法:
语法:$obj = D([‘模型名’]);
含义:实例化我们自己创建的模型(分组/Model目录中);如果传递了模型名,则实例化指定的模型,如果没有指定或者模型名不存在,则直接实例化父类模型(Model.class.php)。
$User = D('User');//实例化模型
// 相当于 $User = new \Home\Model\UserModel();
// 执行具体的数据操作
$User->select();
当 \Home\Model\UserModel 类不存在的时候,D函数会尝试实例化公共模块下面的 \Common\Model\UserModel 类。
D方法还可以支持跨模块调用,需要使用:
//实例化Admin模块的User模型
D('Admin/User');
M方法:
语法:$obj = M([‘不带前缀的表名’]);
表达的含义:直接实例化父类模型(Think目录下的Model.class.php);如果指定了表名,则实例化父类模型的时候关联指定的表;如果没有指定表名(没有传递参数)则不关联表,一般用于执行原生的sql语句(M() -> query(原生的sql语句))。
$User = M('User');// 使用M方法实例化
// 和用法 $User = new \Think\Model('User'); 等效
// 执行其他的数据操作
$User->select();
实例化空模型类
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERE status = 1');