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 [▶]
}
- 對比之後的結論和總結
- 不帶
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 協議》,轉載必須註明作者和本文連結