thinkphp 關聯查詢 N+1 的問題。

來源:互聯網
上載者:User

假設我們有兩張表,作者表和書籍表。一個作者有多本書籍。他們是一對多的關係。我們現在要獲得一個書籍的列表,並且列表中要有書的作者。一般新手的操作如下:

$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();

你可以這樣聯集查詢處理

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.