假設我們有兩張表,作者表和書籍表。一個作者有多本書籍。他們是一對多的關係。我們現在要獲得一個書籍的列表,並且列表中要有書的作者。一般新手的操作如下:
$bookList = $db->query('select * from books');foreach($bookList as &$v) { $v['author'] = $db->query('select name from author where id =' . $v['author_id']);}
上面的案例會執行一次查詢取回所有資料庫表上的書籍,然而每本書籍都會執行一次查詢取得作者。若我們有 25 本書,就會進行 26次查詢。這樣會給資料庫帶來很大的開銷,我們應該盡量一次簡單的查詢就做完。
一般的解決方案就是 join
一條sql就完成了上面的事情。
我在用thinkphp3.2 內建的關聯查詢的時候發現,這個架構的ORM也犯了這個低級錯誤。
class IndexController extends Controller { public function index(){ D('book')->relation(true)->select(); }}
開啟調試器發現每本書都多用了一條sql去查作者。
請問是架構本身就這麼設計了,只能自己手寫join來解決嗎?
回複內容:
假設我們有兩張表,作者表和書籍表。一個作者有多本書籍。他們是一對多的關係。我們現在要獲得一個書籍的列表,並且列表中要有書的作者。一般新手的操作如下:
$bookList = $db->query('select * from books');foreach($bookList as &$v) { $v['author'] = $db->query('select name from author where id =' . $v['author_id']);}
上面的案例會執行一次查詢取回所有資料庫表上的書籍,然而每本書籍都會執行一次查詢取得作者。若我們有 25 本書,就會進行 26次查詢。這樣會給資料庫帶來很大的開銷,我們應該盡量一次簡單的查詢就做完。
一般的解決方案就是 join
一條sql就完成了上面的事情。
我在用thinkphp3.2 內建的關聯查詢的時候發現,這個架構的ORM也犯了這個低級錯誤。
class IndexController extends Controller { public function index(){ D('book')->relation(true)->select(); }}
開啟調試器發現每本書都多用了一條sql去查作者。
請問是架構本身就這麼設計了,只能自己手寫join來解決嗎?
這樣多對一的查詢最好還是用join去解決 再者說 tp的關聯查詢做的真不好…
對單個資料庫的操作用架構內建的方法還是比較簡單的,但是涉及到複雜的sql查詢建議還是自己寫吧
想知道,有沒有對關聯查詢支援比較好的PHP架構,或是DB類。
做視圖不行嗎??
M('book')->join('user on book.auther_id = user.id')->select();
你可以這樣聯集查詢處理