成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

laravel中g(shù)et()與 first()區(qū)別、collection與stdClass的區(qū)別

kycool / 951人閱讀

摘要:本文來自原文鏈接歡迎作客我們的學(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

相關(guān)文章

  • Laravel ORM 返回數(shù)據(jù)類型小結(jié)

    摘要:一簡介的數(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)造器提供了一個方便、...

    LeviDing 評論0 收藏0
  • Laravel & Lumen 數(shù)據(jù)庫操作速查

    摘要:在中執(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...

    用戶83 評論0 收藏0
  • Laravel核心——Ioc服務(wù)容器

    摘要:服務(wù)容器在說容器之前,我們需要了解什么是容器。服務(wù)容器是一個用于管理類依賴和執(zhí)行依賴注入的強大工具。幾乎所有的服務(wù)容器綁定都是在服務(wù)提供者中完成,也就是在服務(wù)提供者中綁定。 服務(wù)容器 在說 Ioc 容器之前,我們需要了解什么是 Ioc 容器。 Laravel 服務(wù)容器是一個用于管理類依賴和執(zhí)行依賴注入的強大工具。 在理解這句話之前,我們需要先了解一下服務(wù)容器的來龍去脈: larave...

    arashicage 評論0 收藏0
  • Laravel核心——服務(wù)容器細節(jié)特性

    摘要:前言首先歡迎關(guān)注我的博客在前面幾個博客中,我詳細講了容器各個功能的使用綁定的源碼解析的源碼,今天這篇博客會詳細介紹容器的一些細節(jié),一些特性,以便更好地掌握容器的功能。 前言 首先歡迎關(guān)注我的博客: www.leoyang90.cn 在前面幾個博客中,我詳細講了 Ioc 容器各個功能的使用、綁定的源碼、解析的源碼,今天這篇博客會詳細介紹 Ioc 容器的一些細節(jié),一些特性,以便更好地掌握容...

    AprilJ 評論0 收藏0
  • Laravel 5.7 最佳實踐和開發(fā)技巧分享

    摘要:當(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)試的...

    ninefive 評論0 收藏0

發(fā)表評論

0條評論

kycool

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<