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