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