zentaoPHP并沒有試著去實(shí)現(xiàn)ORM或者ActiveRecord這樣的概念。因?yàn)槲覀兿嘈?,框架要留給開發(fā)人員足夠的自由發(fā)揮的空間,而不是所有的都要包辦。所以框架里面提供了一個(gè)簡(jiǎn)單方便的數(shù)據(jù)庫訪問對(duì)象類DAO。并且我們?cè)诜庋bDAO的時(shí)候盡可能的兼容標(biāo)準(zhǔn)的sql寫法。
DAO類的定義在lib下面的dao.class.php中??蚣茉诩虞d的時(shí)候,會(huì)自動(dòng)生成$this->dao對(duì)象,可以在control, model或者view層的代碼中直接使用$this->dao來執(zhí)行各種方法。
如果是查詢類的語句,需要使用fetch系列的方法來返回?cái)?shù)據(jù)。更新,刪除,替換這些方法可以使用exec()方法。
DAO在后執(zhí)行的時(shí)候,有下面的方法:
fetch(): 獲得滿足條件的第一次記錄,返回的是對(duì)象格式。 fetch($filed): 獲得滿足條件的第一個(gè)記錄的字段$field對(duì)應(yīng)的值。 fetchAll(): 獲得滿足條件的所有記錄,以數(shù)組格式返回,索引為0-n fetchAll($key): 獲得滿足條件的所有記錄,并使用字段$key作為索引值。 fetchPairs($key, $value): 返回鍵值對(duì)的列表。如果不指定參數(shù),則取返回記錄中的第一個(gè)字段作為key,第二個(gè)字段作為value。 fetchGroup($group, $key): 把滿足條件的記錄按照$group字段進(jìn)行分組。比如把所有$status=active的放在一起。
為了書寫的方便,DAO類里面封裝了若干操作符:
eq: equal,等于 ne: not equal,不等于 gt: great than, 大于 lt: little than, 小于 in: 介于一個(gè)列表中。 between: 在一個(gè)區(qū)間中。 notin:不在一個(gè)列表中。 like: 模糊匹配。
普通的查詢:查詢account=wwccss的記錄。
$this->dao->select('*') ->from('user') ->where('account') ->eq('wwccss') ->fetch();再?gòu)?fù)雜一點(diǎn),加入andWhere (或者orWhere)
$this->dao->select('*')->from('user') ->where('id')->gt(10) ->andWhere('age')->lt(20) ->orderBy('id desc') ->limit('1,10') ->fetchAll()
左連接查詢
$this->dao->select('t1.*, t2.*')->from('user')->alias('t1')->leftJoin('userGroup')->alias('t2')->on('t1.account = t2.account')->fetchAll();其他便利的方法:
$this->dao->findByAccount($account)->from('user')->fetch(); // 魔術(shù)方法,按照account進(jìn)行查詢。 $this->dao->select('*')->from('user')->fetchAll('account'); // 返回的結(jié)果中,以account為key。 $this->dao->select('account, realname')->from('user')->fetchPairs(); // 返回account=>realname的鍵值對(duì)。 $this->dao->select('class, account, realname')->from('user')->fetchGroup('class'); // 按照所屬的class進(jìn)行分組根據(jù)條件拼裝SQL:beginIF, FI()
$this->dao->select('*')->from('user')->where('id')->gt(10)->beginIF($class == 'online')->andWhere('status')->eq('online')->fi()->fetchAll();
使用一個(gè)data對(duì)象來更新。data對(duì)象的key對(duì)應(yīng)到數(shù)據(jù)表中字段名。
$user->account = 'wwccss'; $user->password = '123456'; $this->dao->insert('user')->data($user)->exec();
或者一個(gè)字段一個(gè)字段更新:
$this->dao->insert('user') ->set('account')->eq($account) ->set('password')->eq($password) ->exec();
獲得后插入的記錄id
echo $this->dao->lastInsertID();
更新語句和insert基本類似,可以使用一個(gè)data對(duì)象或者單個(gè)字段進(jìn)行更新。
$user->name = 'wwccss'; $user->age = 10; $this->dao->update('user')->data($user)->where('id')->eq($userid)->limit(1)->exec(); $this->dao->update('user') ->set('account')->eq($account) ->set('password')->eq($password) ->exec()
replace也是需要定義一個(gè)data對(duì)象,然后調(diào)用replace方法。需要注意的事replace要保證表有主鍵或者唯一索引。
$this->dao->replace('user')->data($user)->exec();
$this->dao->delete()->from('user')->where('id')->eq($userid)->exec();
更多建議: