最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用預(yù)加載優(yōu)化Laravel Model查詢詳解

 更新時間:2017年08月11日 10:31:40   作者:godruoyi  
這篇文章主要給大家介紹了關(guān)于如何利用預(yù)加載優(yōu)化Laravel Model查詢的相關(guān)資料,文章通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家介紹了關(guān)于利用預(yù)加載優(yōu)化Laravel Model查詢的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),話不多說了,來一起看看詳細(xì)的介紹:

介紹

對象關(guān)系映射(ORM)使數(shù)據(jù)庫的工作變得非常簡單。 在以面向?qū)ο蟮姆绞蕉x數(shù)據(jù)庫關(guān)系時,可以輕松查詢相關(guān)的模型數(shù)據(jù),開發(fā)人員可能不會注意底層數(shù)據(jù)庫調(diào)用。

下面將通過一些例子,進一步幫助您了解如何優(yōu)化查詢。

假設(shè)您從數(shù)據(jù)庫收到了100個對象,并且每個記錄都有1個關(guān)聯(lián)模型(即belongsTo)。 默認(rèn)使用ORM將產(chǎn)生101個查詢; 如下所示:

//獲取已發(fā)布的100條文章
$posts = Post::limit(100)->get(); //一次查詢

$authors = array_map(function($post) {
 // 對作者模型生成查詢
 return $post->author->name;
}, $posts);

我們在查詢時沒有告訴Post模型,我們還需要所有的作者,所以每次從單個Post模型實例獲取作者的名字時,都會發(fā)生單獨的查詢。

array_maps時發(fā)生100次查詢,加上先前一次查詢,累計產(chǎn)生101次查詢。

預(yù)加載

接下來,如果我們打算使用關(guān)聯(lián)的模型數(shù)據(jù),我們可以使用預(yù)加載將該101個查詢總數(shù)減少到2個查詢。 只需要告訴模型你需要什么來加載。如下:

//獲取已發(fā)布的100條文章 - 并預(yù)加載文章對應(yīng)作者
$posts = Post::with('author')->limit(100)->get();//2次查詢

$authors = array_map(function($post) {
 // 對作者模型生成查詢
 return $post->author->name;//這里講不在產(chǎn)生查詢
}, $posts);

如果你開啟了sql日志,你將看到上述預(yù)加載將只會產(chǎn)生兩條查詢:

select * from `posts`
select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]

如果您有多個關(guān)聯(lián)模型,則可以使用數(shù)組加載它們:

$posts = App\Post::with(['author', 'comments'])->get();

接下來我們重新定義如下關(guān)系

Post -> belongsTo -> Author //每個文章只屬于一個用戶
Author -> hasMany -> Post //每個用戶擁有多個文章
Author -> hasOne -> Profile //每個用戶只有一個簡介

考慮下述情況:獲取已發(fā)布文章所屬作者的個人簡介。

//獲取所有文章 - 并預(yù)加載文章對應(yīng)作者
$posts = App\Post::with('author')->get();//兩次查詢

//根據(jù)每個 `作者` 獲取其簡介
$posts->map(function ($post) {
 //雖然我們直接通過$author = $post->author不會產(chǎn)生查詢,
 //但當(dāng)調(diào)用$author->profile時,每次都會產(chǎn)生一個新查詢
 return $post->author->profile;
});

假設(shè)上述App\Post::with('author')->get()有100條記錄,將會產(chǎn)生多少條查詢呢?

通過優(yōu)化預(yù)加載,我們可以避免嵌套關(guān)系中的額外查詢。

//獲取所有文章 - 并預(yù)加載文章對應(yīng)作者及每個作者對應(yīng)de profile
$posts = App\Post::with('author.profile')->get();//三次查詢

$posts->map(function ($post) {
 //不在產(chǎn)生新查詢
 return $post->author->profile;
});

你可以打開你的sql日志看到對應(yīng)的三條查詢。

select * from `posts` 
select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [.....] 
select * from `profiles` where `profiles`.`author_id` in (?, ?, ?, ?, ?) [.....] 

懶惰加載

有時候您可能只需要根據(jù)條件收集相關(guān)聯(lián)的模型。 在這種情況下,您可以懶惰地調(diào)用相關(guān)數(shù)據(jù)的其他查詢:

$posts = App\Post::all();//一次查詢

$posts->load('author.profile');//兩次查詢
$posts->map(function ($post) {
 //不在產(chǎn)生新查詢
 return $post->author->profile;
});

查看您的sql日志,總共看到三個查詢,但只有調(diào)用$posts->load()時才會顯示。

結(jié)論

希望您更加了解有關(guān)加載型號的更多信息,并了解其在更深層次上的工作原理。 Laravel相關(guān)的文檔已經(jīng)很全面了,希望額外的實踐練習(xí)可以幫助您更有信心優(yōu)化關(guān)系查詢。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

原文譯自eloquent-eager-loading,簡化其前面構(gòu)造數(shù)據(jù)部分。

相關(guān)文章

  • PHP中的類型提示(type hinting)功能介紹

    PHP中的類型提示(type hinting)功能介紹

    這篇文章主要介紹了PHP中的類型提示(type hinting)功能介紹,本文講解了類型提示的作用和使用方法以及使用示例,需要的朋友可以參考下
    2015-07-07
  • Laravel框架路由配置總結(jié)、設(shè)置技巧大全

    Laravel框架路由配置總結(jié)、設(shè)置技巧大全

    這篇文章主要介紹了Laravel框架路由配置總結(jié)、設(shè)置技巧大全,Laravel 中最簡單的路由由一個URI和一個閉包調(diào)用組成,需要的朋友可以參考下
    2014-09-09
  • PHP實現(xiàn)百度人臉識別

    PHP實現(xiàn)百度人臉識別

    這篇文章主要為大家詳細(xì)介紹了PHP實現(xiàn)百度人臉識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • PHP的openssl加密擴展使用小結(jié)(推薦)

    PHP的openssl加密擴展使用小結(jié)(推薦)

    下面小編就為大家?guī)硪黄狿HP的openssl加密擴展使用小結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Zend Framework+smarty用法實例詳解

    Zend Framework+smarty用法實例詳解

    這篇文章主要介紹了Zend Framework+smarty用法,結(jié)合實例形式詳細(xì)分析了Zend Framework框架整合Smarty模板的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • PHP生成器簡單實例

    PHP生成器簡單實例

    這篇文章主要介紹了PHP生成器簡單實例,本文講解了range、xrange函數(shù)的基本使用實例,需要的朋友可以參考下
    2015-05-05
  • Joomla框架實現(xiàn)字符串截取的方法示例

    Joomla框架實現(xiàn)字符串截取的方法示例

    這篇文章主要介紹了Joomla框架實現(xiàn)字符串截取的方法,涉及php字符串及正則操作相關(guān)技巧,需要的朋友可以參考下
    2017-07-07
  • 如何正確配置Nginx + PHP

    如何正確配置Nginx + PHP

    這篇文章主要為大家詳細(xì)介紹了配置Nginx + PHP的步驟,了解Nginx + PHP配置的簡單教程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • PHP網(wǎng)頁安全認(rèn)證的實例詳解

    PHP網(wǎng)頁安全認(rèn)證的實例詳解

    這篇文章主要介紹了PHP網(wǎng)頁安全認(rèn)證的實例詳解的相關(guān)資料,這里提供了兩種實現(xiàn)方法,一種基于數(shù)據(jù)庫另一種不基于數(shù)據(jù)庫的方法,希望通過本能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • PHP 獲取 ping 時間的實現(xiàn)方法

    PHP 獲取 ping 時間的實現(xiàn)方法

    這篇文章主要介紹了PHP 獲取 ping 時間的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09

最新評論

洪江市| 谷城县| 交口县| 阳原县| 堆龙德庆县| 内丘县| 凤山县| 改则县| 建昌县| 宝清县| 鱼台县| 中超| 兴安盟| 土默特左旗| 吉林市| 聊城市| 普安县| 宁蒗| 灯塔市| 黔东| 石渠县| 利川市| 新余市| 嘉祥县| 扎赉特旗| 顺义区| 丹棱县| 元阳县| 宾川县| 长垣县| 桃源县| 丹江口市| 木兰县| 墨竹工卡县| 南安市| 崇信县| 凤台县| 永和县| 漯河市| 宝兴县| 大宁县|