以前聽說過thinkphp關聯模型效率比較低,但是一直沒去看源**,(現在也沒看),今天寫rbac的時候才感覺到
user表,字段:id,nickname
role表,字段:id,remark
role_user表,user_id,role_id
將所有使用者列出來,並顯示其所在使用者組:
一:使用thinkphp的關聯模型
user關聯模型**:
'role' => array(
'foreign_key' => 'user_id',
'relation_foreign_key'=>'role_id',
'relation_table'=>'role_user',
)控制器**:
$model=d('user');
$userlist=$model->relation(true)->where('status=1')->field('id,nickname')->select();
$this->assign('userlist',$userlist);
sql執行過程:
show columns from `user` [ runtime:0.056465s ]
select `id`,`nickname` from `user` where ( status=1 ) [ runtime:0.005138s ]
show columns from `role` [ runtime:0.006380s ]
select b.remark from role_user as a, role as b where a.role_id = b.id and a. user_id='2' [ runtime:0.005514s ]
select b.remark from role_user as a, role as b where a.role_id = b.id and a. user_id='4' [ runtime:0.005346s ]
select b.remark from role_user as a, role as b where a.role_id = b.id and a. user_id='5' [ runtime:0.005328s ]
二:自行寫sql語句
**:
$model=new model();
$sql="select r.remark as role,u.id,u.nickname from (user as u left join role_user as ru on u.id=ru.user_id) left join role as r on ru.role_id=r.id where u.status=1";
$userlist=$model->query($sql);
$this->assign('userlist',$userlist);
sql執行過程:
select r.remark as role,u.id,u.nickname from (user as u left join role_user as ru on u.id=ru.user_id) left join role as r on ru.role_id=r.id where u.status=1 [ runtime:0.005093s]
使用thinkphp關聯模型使用時間加起來時間為0.084171s,相比自己寫的sql執行時間漫長很多,而且例子中只有三條資料,當資料量增多的時候,使用thinkphp的關聯模型時間會長很多很多,因為每有一條資料,就會執行一條sql語句,執行效率可以想像有多低。所以建議大家自己寫sql語句。
而且,有乙個更重要的問題是,當你使用orm提供的方法習慣了的時候,你會對原生sql變得陌生,這就變相的使你的能力變弱。簡單的curd操作可以使用curd,稍微複雜點的就應該自己寫了,使用sql你可以更靈活,而且可以自行優化,好處多多。
所以個人覺得最佳辦法就是:簡單的增刪改查用orm提供的現成的方法,更複雜的在orm裡面執行sql語句,這樣不僅能寫出複雜高效的資料庫執行,也能使用orm物件。
關於thinkphp關聯模型的HAS ONE
距離第一次學習thinkphp有一年多了,也算是認識它和使用它一年多了吧,但是發現我對thinkphp還是有些不熟悉的地方,特別是模型。最近開發二手房專案,裡面用到模型,然後資料庫是沿用之前的,框架轉為thinkphp,之前一直自己設計資料庫,所以模型可以做的和官方一樣,但是這次因為資料庫不便於改動...
ThinkPHP關聯模型詳解
在thinkphp中,關聯模型更類似一種mysql中的外來鍵約束,但是外來鍵約束更加安全,缺點卻是在寫sql語句的時候不方便,thinkphp很好得解決了這個問題.但是很多人不動關聯模型的意思.現在就寫個例子.讓大家理解thinkphp關聯模型的意思.環境描述 公司有乙個員工表think user,...
ThinkPHP關聯模型詳解
在thinkphp中,關聯模型更類似一種mysql中的外來鍵約束,但是外來鍵約束更加安全,缺點卻是在寫sql語句的時候不方便,thinkphp很好得解決了這個問題.但是很多人不動關聯模型的意思.現在就寫個例子.讓大家理解thinkphp關聯模型的意思.環境描述 公司有乙個員工表think user,...