日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

三十、PHP框架Laravel学习笔记——模型的预加载

發布時間:2024/7/5 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三十、PHP框架Laravel学习笔记——模型的预加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.預加載

  • 預加載,就是解決關聯查詢中產生的 N+1 次查詢帶來的資源消耗
  • 我們要獲取所有書籍的作者(或擁有者),普通查詢方案如下:
    //獲取所有書籍列表
  • $books = Book::all();

    //遍歷每一本書

    foreach ($books as $book) { //每一本書的關聯用戶的姓名 DebugBar::info($book->user->username); }


    PS:通過調試器 Debugbar 中 SQL 語句的分析,發現包含十多條 SQL 語句;
    PS:原因是關聯查詢時,每遍歷一次就會執行一遍 SQL 語句,導致性能欠佳;
    PS:所謂 N+1 條,就是起初獲取全部數據的 1 條和,遍歷的 N 條;

  • 使用 with()關鍵字,進行預載入設置,提前將 SQL 整合;
    //with 關鍵字預載入
  • $books = Book::with('user')->get(); foreach ($books as $book) { DebugBar::info($book->user->username); }

    PS:此時的 SQL 執行數目為:1+1 條;也支持數組多個關聯 with[‘book’,‘prifile’];
    PS:預加載也可以設置顯示的列;
    //預載入設置指定的列

    $books = Book::with('user:id,username')->get();

  • 如果每次都必須使用預載入進行關聯查詢,可以在模型中定義;
  • protected $with = ['user'];


    PS:此時就可以像最初那樣寫代碼,而不需要使用 with()方法了;

  • 為了演示方便,暫時取消模型$with,再看下預載入結合篩選;
  • $books = Book::with(['user' => function ($query) { $query->where('id', 19); }])->get();


    PS:預載入篩選不可以使用 limit、take 方法;

  • 有時,可能會產生邏輯判斷是否查詢數據,但預加載會提前關聯執行;

  • 這樣,會導致資源性能的浪費,這時,可以采用延遲預載入;

  • $books = Book::all(); if (true) { $books = $books->load('user'); //load(['user' => function () {}]) foreach ($books as $book) { DebugBar::info($book->user->username); } }



  • 使用 loadCount()方法,可以實現延遲關聯統計;
  • $users = User::all(); if (true) { return $users->loadCount('book'); }


    總結

    以上是生活随笔為你收集整理的三十、PHP框架Laravel学习笔记——模型的预加载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。