PDO方式(適合多表連接查詢)。? ? ? ? ? ? ? ? ? (推薦學習:yii框架)
$sql?=?"";//原生態sql語句? xx::model()->dbConnection->createCommand($sql)->execute();??非select語句(update、insert、delete) xx::model()->dbConnection->createCommand($sql)->queryRow();?查詢select一條記錄 xx::model()->dbConnection->createCommand($sql)->queryAll();?查詢select多條記錄 $sql?=?"select?a.*,?count(b.role_id)as?num?from?{{user_role}}?a?left?join?{{user}}?b?on?a.id?=?b.role_id?group?by?b.role_id?order?by?a.id"; $user_role_info?=?UserRole::model()->dbConnection->createCommand($sql)->queryAll();? $this->render("list",?array('user_role_info'=>$user_role_info));
比如
$sql?=?"select?a.*,?count(b.role_id)as?num?from?slgo_user_role?a?left?join?slgo_user?b?on?a.id?=?b.role_id?group?by?b.role_id?order?by?a.id"; $user_role_info?=?UserRole::model()->dbConnection->createCommand($sql)->queryAll();? $this->render("list",?array('user_role_info'=>$user_role_info));
Active Record方式
(1)New
$post=new?Post;? $post->title='sample?post';? $post->content='post?body?content';? $post->save();
Criteria方式
也可以使用 $condition 指定更復雜的查詢條件。 不使用字符串, 我們可以讓 $condition 成為一個 CDbCriteria 的實例,它允許我們指定不限于 WHERE 的條件。
$criteria=new?CDbCriteria;? $criteria->select='title';??//?只選擇?'title'?列? $criteria->condition='postID=:postID';? $criteria->params=array(':postID'=>10);? $post=Post::model()->find($criteria);
一種替代 CDbCriteria 的方法是給 find 方法傳遞一個數組。 數組的鍵和值各自對應標準(criterion)的屬性名和值
上面的例子可以重寫為如下:
$post=Post::model()->find(array(? ????'select'=>'title',? ????'condition'=>'postID=:postID',? ????'params'=>array(':postID'=>10),? ));
當一個查詢條件是關于按指定的值匹配幾個列時, 我們可以使用 findByAttributes()。我們使 $attributes 參數是一個以列名做索引的值的數組。
在一些框架中, 此任務可以通過調用類似findByNameAndTitle的方法實現。
雖然此方法看起來很誘人, 但它常常引起混淆, 沖突 和比如列名大小寫敏感的問題。
Query Builder 方式
$user?=?Yii::app()->db->createCommand()? ????->select('id,?username,?profile')? ????->from('tbl_user?u')? ????->join('tbl_profile?p',?'u.id=p.user_id')? ????->where('id=:id',?array(':id'=>$id))? ????->queryRow();
一、在用好AcitveRecord的情況下,即不要讓其生成比較二的SQL查詢方式,我的經驗,不必過分在意那點時間性能上的區別的。對于大數據查詢,內存空間上的話,在yii2中可以使用 toArray() 來節省內存消耗。
二、ActiveRecord之于PDO的長處在于其方便。
一個是相比于書寫SQL語句,用ActiveRecord要簡單一點,更重要的是不容易出錯。
二是提供了許多SQL語句之外的便利,比如參數過濾、綁定等等。這個web開發中你總要遇到吧,一個SQL語句一個SQL語句的寫,代碼復用程度不高不說,還容易某個地方忘記過濾了,形成安全隱患。
三、 Yii2中已經有Query,性能上優于ActiveRecord,可以作為替代。當然,方便與效率是硬幣的兩面,其使用上不如ActiveRecord 方便。
但在項目中我的經驗是Query的使用頻率僅略少于ActiveRecord,個人認為Query/ActiveQuery是Yii2中引入的一個 激動人心的新feature。
四、前面幾條說的是ActiveRecord的應用場景。對于PDO,如果要用的話, 應該是對于比較復雜的SQL操作,比如一兩句話寫不清楚的。
這種情況下,使用ActiveRecord來構建,其復雜程度不亞于直接寫SQL,那么可以考 慮使用PDO。但我印象中,如果項目中使用的SQL語句很復雜,會被寫成DB的View或者存儲過程,所以,感覺PDO使用并不多,可以說是極少的。
五、追求更高效率的話,個人也不認為應該過多使用PDO,這給后期維護帶來極大的難度。倒是可以考慮優化SQL查詢,優化索引和表結構,使用緩存等。值得一提的是,使用緩存,是最簡單、直接,成效也最為明顯的手段。
六、永遠沒必要過早考慮性能問題