關於thinkphp關聯模型的效率問題

2021-06-23 08:37:03 字數 2230 閱讀 5752

以前聽說過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,...