摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群最簡單的,里得到的是一組數(shù)據(jù),得到的是一個數(shù)據(jù)。
本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050
最簡單的,laravel里get()得到的是一組數(shù)據(jù),first()得到的是一個model數(shù)據(jù)。
從形式上,laravel里每一個model數(shù)據(jù)(record),在取出的時候都是用的PHP的stdClass來包裹或封裝,一個model數(shù)據(jù)就是一個stdClass,stdClass是一個沒有屬性和方法的空類,一般用來創(chuàng)建一個匿名對象或?qū)⒎菍ο箢愋娃D(zhuǎn)換成對象,這樣我們就可以很放便的操作它,動態(tài)的添加、刪除屬性:
//實例化一個空對象 $obj = new stdClass(); //給對象動態(tài)添加屬性或者方法 $obj->name = "pilishen.com"; $obj->description = "做全球最好的IT實戰(zhàn)教程";
那么,當(dāng)有多條數(shù)據(jù)取出來的時候,也即有多個stdClass的時候,我們怎么來展現(xiàn)或包裹呢?就是Collection,集合的意思。
所以,進一步說,在model數(shù)據(jù)調(diào)取中,laravel first()取到的就是一個stdClass,而get()取到的是多個stdclass,無非是以Collection的形式包裹了起來,下面舉個類子列出所有省份:
可以看到,因為是取出多條數(shù)據(jù),所以返回的是一個Collection{}對象,里面包含一個items[]數(shù)組(序列),在這個序列里,裝的就是每一個stdClass{}對象,也即具體的每一個Province數(shù)據(jù)。
我們再來打印一下first()方法獲取的結(jié)果
我們可以看到first()方法得到的直接是一個stdClass對象,因為它外層沒有array包裹了,所以就可以直接在其上面獲取各種屬性了,比如說可以直接來調(diào)用關(guān)系(relationship)了,假設(shè)我們創(chuàng)建一個 Province hasMany City 的例子:
這樣我們就可以使用 Province::fisrt()->cities()來獲取第一個省所屬的所有城市,那如果需要獲取 id為n 的省的所有城市的話我們可以使用 Province::find(n)->cities(), 這里的find()方法得到的也是一個具體到ID了的stdClass 對象。
這里注意的是,關(guān)系(eloquent relationship)的調(diào)用只能作用于某個具體的Model對象,也即你只有具體到某個Model,某個ID,或者說某個stdclass對象了,才能進一步去調(diào)用其所屬的關(guān)系,而不能直接去一堆Model數(shù)據(jù)上調(diào)用關(guān)系,或者說不能直接在一個大的collection對象后面直接取關(guān)系, 也即這樣Province::get()->cities()是不對的,這相當(dāng)于Collection{}->cities(),而這個Collection{}本身并沒有cities()這個關(guān)系屬性,雖然它里面的每一個Province model item擁有這個關(guān)系屬性,但那就隔著一層了。
好吧,不能在get()后面直接調(diào)取關(guān)系,或者說不能籠統(tǒng)地在一堆數(shù)據(jù)上直接調(diào)取關(guān)系,那么,調(diào)取關(guān)系的正確姿勢有哪些?
你可以在first() last() find() firstOrFail() findOrFail()這些具體到ID的方法后面直接取關(guān)系,比如Province::fisrt()->cities()
如果你已經(jīng)get()了,也即已經(jīng)有一堆數(shù)據(jù)了,那么可以遍歷以后再取每一個的關(guān)系,比如:
$pros = Province::get(); //或者all() foreach($pros as $pro){ $pro->cities(); }
當(dāng)然,如果你是要在Blade視圖里使用遍歷后的關(guān)系數(shù)據(jù),因為每有一個數(shù)據(jù),就要取一次關(guān)系,就要執(zhí)行一次查詢,所以你foreach里有n個數(shù)據(jù),就查詢n遍,就有n個query,再加上你之前get()所有數(shù)據(jù)的那1個query,所以你頁面上總共有n+1個query,當(dāng)你數(shù)據(jù)很多的時候,就會導(dǎo)致頁面特別慢,所以你一旦意識到要在視圖里取關(guān)系屬性,就要在Controller里提前用with方法來預(yù)加載所有的關(guān)系,例如這樣:
$pros = Province::with("cities")->get(); //或者all() foreach($pros as $pro){ $pro->cities(); }
這樣的話,一次性地取得了所有省份以及每個省份下面的城市關(guān)系,背后只是執(zhí)行了2次query,你在視圖里再去遍歷的時候,就不用再執(zhí)行數(shù)據(jù)查詢了,性能就會有較大提升。
很多小白抱怨laravel視圖加載慢,不知道他們有沒有查看一下自己頁面的query執(zhí)行情況呢?一個視圖查詢太多的query,換誰都慢~
當(dāng)然呢,這些細節(jié)其實在我們的實戰(zhàn)系列課程里都已經(jīng)講過了,還沒有上車的童鞋,你還在等什么呢?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28285.html
摘要:一簡介的數(shù)據(jù)庫查詢構(gòu)造器提供了一個方便流暢的接口,用來創(chuàng)建及運行數(shù)據(jù)庫查詢語句。的查詢構(gòu)造器使用參數(shù)綁定,來保護你的應(yīng)用程序免受注入的攻擊。和返回的是影響行數(shù),即失敗為,成功為刪除行數(shù)。 相信很多人在學(xué)習(xí) Laravel 時,會對 ORM 返回的數(shù)據(jù)類型產(chǎn)生混淆,如返回集合,?;蛘哒麛?shù)類型,下面將對增刪改查操作進行一個小結(jié)。 一、簡介 Laravel 的數(shù)據(jù)庫查詢構(gòu)造器提供了一個方便、...
摘要:在中執(zhí)行數(shù)據(jù)庫操作有兩種方式,一種是使用外觀對象的靜態(tài)方法直接執(zhí)行查詢,另外一種是使用類的靜態(tài)方法實際上也是的實現(xiàn),使用靜態(tài)訪問方式訪問的方法,內(nèi)部采用了魔術(shù)方法代理了對成員方法的訪問。在閉包函數(shù)中,如果返回,則會停止后續(xù)的處理。 在Laravel中執(zhí)行數(shù)據(jù)庫操作有兩種方式,一種是使用DB外觀對象的靜態(tài)方法直接執(zhí)行sql查詢,另外一種是使用Model類的靜態(tài)方法(實際上也是Facade...
摘要:服務(wù)容器在說容器之前,我們需要了解什么是容器。服務(wù)容器是一個用于管理類依賴和執(zhí)行依賴注入的強大工具。幾乎所有的服務(wù)容器綁定都是在服務(wù)提供者中完成,也就是在服務(wù)提供者中綁定。 服務(wù)容器 在說 Ioc 容器之前,我們需要了解什么是 Ioc 容器。 Laravel 服務(wù)容器是一個用于管理類依賴和執(zhí)行依賴注入的強大工具。 在理解這句話之前,我們需要先了解一下服務(wù)容器的來龍去脈: larave...
摘要:前言首先歡迎關(guān)注我的博客在前面幾個博客中,我詳細講了容器各個功能的使用綁定的源碼解析的源碼,今天這篇博客會詳細介紹容器的一些細節(jié),一些特性,以便更好地掌握容器的功能。 前言 首先歡迎關(guān)注我的博客: www.leoyang90.cn 在前面幾個博客中,我詳細講了 Ioc 容器各個功能的使用、綁定的源碼、解析的源碼,今天這篇博客會詳細介紹 Ioc 容器的一些細節(jié),一些特性,以便更好地掌握容...
摘要:當(dāng)查詢數(shù)據(jù)時,本地范圍允許我們創(chuàng)建自己的查詢構(gòu)造器鏈式方法。這樣便會知道這是一個本地范圍并且可以在查詢構(gòu)造器中使用。某些查詢構(gòu)造器不可用或者說可用但是方法名不同,關(guān)于這些請查閱所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可編寫出干凈,可用可調(diào)試的...
閱讀 2284·2021-11-16 11:44
閱讀 652·2019-08-30 15:55
閱讀 3287·2019-08-30 15:52
閱讀 3625·2019-08-30 15:43
閱讀 2208·2019-08-30 11:21
閱讀 446·2019-08-29 12:18
閱讀 1959·2019-08-26 18:15
閱讀 483·2019-08-26 10:32