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