使用 D()方法比直接使用模型类更加的智能,如果在\Home\Model\UserModel 找

不到该模型类, 那么就会去公共模块下找\Common\Model\UserModel 去找。 如果还找不到,

就会直接实例化基类 Model()类,也就是等同于使用 M()方法。

需要注意两点:

一、

D(‘User’)方法中的表名需要首字母大写,因为查找跳到公共模块里时无法识别小写的user,除非你显式的写成:D(‘Common/user’),这样完整的写法用小写user也行,否则若你直接用 D(‘user’) 的话,它会跳过公共模块直接去实例化基类Model()。因此建议养成表的首字母大字的习惯,以防出错。

二、

手册上说过:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。

即:D('Admin/User');表示在Admin模块下去找,找不到,跳过公共模块,直接实例化User表

另外,如果使用索引数组作为查询条件也要注意:

D('User')方法查找到的模型如果有手工定义数据字段的话,那么查询包含这些手工字段时可能找不到记录。  --有手工字段时不会生成数据缓存( 即使关闭调试模式 )

意思是这样滴:

namespace Home\Model;

use Think\Model;

class UserModel extends Model{

protected $fields=array(  // 这是手工定义字段( 可以防止生成缓存文件 )

'id',

'user',

'_pk'=>'id',

'type'=>array(

'id'=>'smallint',

'user'=>'varchar'

    )

);

        // ...

}

此时在控制器下使用如下代码时:

        $user=D('User');

        $c['id']=2;

        $c['user']='樱桃小丸子';

        print_r($user->where($c)->select()); // 使用索引数组查询

可能会查询不到结果,除非注释掉手工字段,或者使用M(‘User’)方法。

原因是手工字段如果在数据表里不存在的话(即手工字段为新建),这样的记录在表中不存在,

如果手工字段名称在表里已经存在,那么查询还是有结果的。

备注: 开启调试模式后,不生成数据缓存,数据表结构和记录都实时更新,io开销大

    关闭调试模式后,开始生成数据缓存,仅表结构缓存,记录仍然实时更新

    无论开关调试模式,一旦手工定义字段,则不生成数据缓存,

    数据表结构和记录都实时更新,有利于避免了io开销,但表结构显示的仅为手工字段