Laravel 模型關聯 「 預載入 」中 with () 方法的功能的示例及說明

weiqier 發表於 2019-10-06

laravel 模型關聯 「 預載入 」 ->with()功能的示例

1 模型關聯說明:在動態模型 Status中,指明一條微博動態屬於一個使用者 User

<?php
.
.
// 動態模型status    關聯belongsTo    使用者模型user
class Status extends Model {
    public function user() {
        return $this->belongsTo(User::class);
    }
}

2.不使用預載入,呼叫資料時:

// 獲取微博動態的釋出使用者     不使用預載入                             
$statuses = App\Status::all();       

// foreach之前執行 dd($statuses);
foreach ($statuses as $status) {          
    echo $status->user->name;              
}                                      

dd()列印的結果 ,請注意關注點1 #relations: []為空

LengthAwarePaginator {#319 ▼
  #total: 89
  #lastPage: 12
  #items: Collection {#430 ▼
    #items: array:8 [▼
      0 => Status {#431 ▶}
      1 => Status {#432 ▶}
      2 => Status {#438 ▼
        #fillable: array:1 [▶]
        #connection: "mysql"
        #table: "statuses"
        .
        .
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: []     ==============================>>關注點1
        #touches: []
        +timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
    ]
  }
  .
  .
  #options: array:2 [▶]
}

3.使用預載入with('user')呼叫資料時:

// 獲取微博動態的釋出使用者     使用預載入 with('user')                                  
$statuses = App\Status::with('user')->get();       

// foreach之前執行 dd($statuses);
foreach ($statuses as $status) {          
    echo $status->user->name;              
}                                      

dd()列印的結果 ,請注意下面標註的 關注點1#relations: [] 不為空,關注點2 含有對應的user的全部資訊

LengthAwarePaginator {#329 ▼
  #total: 89
  #lastPage: 12
  #items: Collection {#425 ▼
    #items: array:8 [▼
      0 => Status {#432 ▶}
      1 => Status {#433 ▶}
      2 => Status {#439 ▼
        #fillable: array:1 [▶]
        #connection: "mysql"
        .
        .
        #dispatchesEvents: []
        #observables: []
        #relations: array:1 [▼        // =========================>>>>>關注點1
          "user" => User {#445 ▼
            #fillable: array:3 [▶]
            #hidden: array:2 [▶]
            #casts: array:1 [▶]
            .
            .
            #attributes: array:11 [▼     // ======================>>>>>關注點2
              "id" => 5
              "name" => "婁亮"
              "email" => "[email protected]"
              "email_verified_at" => "2019-10-05 19:49:31"
              "password" => "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
              "remember_token" => "N4nrVyeptW"
              "created_at" => "2007-07-14 13:34:01"
              "updated_at" => "2007-07-14 13:34:01"
              "is_admin" => 0
              "activation_token" => null
              "activated" => 1
            ]
            #original: array:11 [▶]
          .
          .
            #rememberTokenName: "remember_token"
          }
        ]
        #touches: []
        +timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
    ]
  }
  #options: array:2 [▶]
}
  1. 對比之後的結論和總結
    • 不帶with('user')方法時,由關注點1可知 relations[]為空,$statuses 只包動態資訊
    • with('user')時,由關注點2可知,每一個status 都有與其對應一個user屬性(含包使用者的全部資訊)
    • 重點:預載入方法with()的意思就是在foreach 執行獲取name之前,已經全部把每一個動態所對應的所有的 name 已經全部準備好了,因此可以有如下結論:
    • 不帶with('user')只有動態資訊沒有動態對應的使用者資訊,foreach每遍歷一次,就要通過 $status->user->name 查詢一次資料庫。
    • with('user'),擁有動態資訊和使用者資訊,foreach 只對$statuses遍歷,不需要查詢資料庫。

Practice makes perfect !


相關文章

Laravel Passport OAuth 資料庫查詢改快取優化 資料庫|Laravel

Laravel Passport OAuth 資料庫查詢改快取優化

1、oauth_clients 表查詢快取修改-- 找到路徑 project/vendor/laravel/passport/src/Client.php 檔案註釋該行程式碼,不然查詢出來存快取無法獲
發現使用 Laravel 的許可權工具包不會使用,有同感的? Laravel

發現使用 Laravel 的許可權工具包不會使用,有同感的?

感覺看的有點懵,我不用工具包,自己建立表 用原生思路的程式碼寫 能寫 出來居於 auth 許可權控制選單按鈕的許可權管理,看來我還是太菜了 -,-
Laravel 多鍵路由繫結 Laravel

Laravel 多鍵路由繫結

Laravel 可以通過兩種方式進行路由模型繫結。在模型中指定路由的鍵/** * 獲取該模型的路由的自定義鍵名。 * * @return string */public function getRou
自定義 Command 檢視 Laravel 日誌 Laravel

自定義 Command 檢視 Laravel 日誌

Unix 的 tail 命令可以用來檢視檔案的,例如檢視 2019-09-26 的最後 100 行日誌$ cd storage/logs $ tail -100 laravel-2019-09-26
老王帶你看原始碼|Laravel 的路由匹配的過程都幹了些什麼? Laravel

老王帶你看原始碼|Laravel 的路由匹配的過程都幹了些什麼?

Laravel 的路由配置有很多,可以設定域名,設定請求協議,設定請求方式,請求路徑。那麼,Laravel在獲取到請求之後,去匹配路由都做了些什麼呢?本文以Laravel5.8原始碼講解,帶你一步步看
Windows 下 Laravel Mix 資源編譯過程以及產生的錯誤解決 Laravel

Windows 下 Laravel Mix 資源編譯過程以及產生的錯誤解決

環境說明虛擬機器 : Homestead ;物理機 : Windows 10 x64 系統 ;編輯器 : Sublime Text 3 ;終端 : git bash ;說明:以上環境不必完全保持一致
Laravel Vue 下拉框聯動小技巧 Vue|Laravel

Laravel Vue 下拉框聯動小技巧

最近在做一個後臺管理相關的東西,有一個關於下拉框聯動的小技巧可以分享給大家,寫好後不用更改前端程式碼,只需更改後端相應的配置,即可增加相對應的聯動。比如有兩個下拉框一個省和一個市的下拉框,這裡只是拿省
學習 Laravel —— 前端篇(持續更新) 前端|Laravel

學習 Laravel —— 前端篇(持續更新)

laravel 6.0一開始在 homestead 環境中使用 npm install / npm run dev 各種報錯,無法解決。最後在window下安裝了最新的 node.js 和修改 pac
Laravel 模型關聯的『動態屬性』,Eloquent: 關聯以後可以獲取模型的集合 Laravel

Laravel 模型關聯的『動態屬性』,Eloquent: 關聯以後可以獲取模型的集合

1. 以下是 laravel文件中的描述 文件連結一旦關係被定義好以後,就可以通過訪問 模型 的 屬性 來獲取集合。記住,由於 Eloquent 提供了『動態屬性』 ,所以我們可以像訪問模型的屬性一
Laravel 資料庫裡的資料刪除 資料庫|Laravel

Laravel 資料庫裡的資料刪除

想請問Laravel資料庫裡的資料如何刪除讓id重新編號,單純刪除資料庫的資料,在重新增加id會從被刪掉的id後開始新增,而不會從刪掉的id開始編號,我該使用什麼artisan command去刪除來
關於 Laravel 的一些個人見解 Laravel

關於 Laravel 的一些個人見解

Laravel 是一個全棧框架;我們使用 Laravel 開發業務常見有 3 個方向;1、前端頁面和後端邏輯混合的應用主要是面向對 SEO 有需求的專案;比如說新聞資訊部落格文章等;一般在控制器中 r
Laravelapi 自定義 response 格式 Laravel

Laravelapi 自定義 response 格式

laravel的http路由檔案有兩個api.php和web.php➜  ~ ll /Users/shiwenyuan/test/test_demo/routestotal 32drwxr-xr-x