当然,如果有必要使用具体的模型类时,ThinkPHP 还提供了 D()方法来直接是实例化 模型类,并且还可以免去引入命名空间等操作。
//实例化UserModel类 $user = D('User');
PS:使用 D()方法比直接使用模型类更加的智能,如果在HomeModelUserModel 找不到该模型类,那么就会去公共模块下找CommonModelUserModel 去找。
如果还找不到, 就会直接实例化基类 Model()类,也就是等同于使用 M()方法。
D()方法可以直接调用当前模块的模型类,那么如果跨模块调用的话,那怎么处理呢?
比如 Admin 后台模块,可以使用目录声明。
//跨模块实例化 $user = D('Admin/User'); 有时,你可能想使用原生的 SQL 语句进行操作数据库。
那么可以采用实例化空模型基 类或者空 M()方法。
//空 M()方法 $user = M(); //或者new Model(); 空基类 var_dump($user->query("SELECT * FROM think_user WHERE user='蜡笔小新 '"));
三.字段定义 每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的 字段信息。
而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了 运行时缓存或者设置不缓存。
如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。
生成缓存 的目的显而易见,就是为了快速响应。ThinkPHP 默认是开启字段缓存,因为在实际运行中, 不会更改字段结构。
字段缓存文件保存在 Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常 变动,所以要关闭缓存。
关闭缓存的方法为: // 关闭字段缓存 'DB_FIELDS_CACHE'=>false //开启了调试模式,自动关闭 PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除 /Data/_fields 文件夹,重新获取字段。 //查看字段结构 var_dump($user->getDbFields());
你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能, 避免 IO 开销。
//手动定义数据表字段,_pk表示主键 class UserModel extends Model { protected $fields = array('id', 'user', '_pk'=>'id'); }
//type 定义每个字段的类型,可以永远字段验证
class UserModel extends Model { protected $fields = array('id', 'user', '_pk'=>'id', 'type'=>array('id'=>'smallint','user'=>'varchar')); }