首页 > 代码库 > D()方法的寻找顺序

D()方法的寻找顺序

使用 D()方法比直接使用模型类更加的智能,如果在HomeModelUserModel 找不到该模型类, 那么就会去公共模块下找CommonModelUserModel 去找。 如果还找不到,就会直接实例化基类 Model()类,也就是等同于使用 M()方法。

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

 

当然,上述问题主要是由于用小写的user时:

D(‘user‘)方法在 Home 模块里可以识别,直接实例化也没问题,唯有跨模块(比如Common)仿问时才会发生。当然,M(‘user‘)方法用小写也可以识别。

 

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

D(‘User‘)方法查找到的模型如果有手工定义数据字段的话,那么查询将无法生效。意思是这样滴:

namespace HomeModel;

use ThinkModel;

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’)方法。

D()方法的寻找顺序