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" => "doloribus98@example.com"
              "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遍歷,不需要查詢資料庫。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

Practice makes perfect !

相關文章