我已經閱讀了我得到的檔案,如果呼叫關系如下:users()->author->name
它每次在 db 中發送另一個請求。
但是如果使用User()::with("author")
它來呼叫它將被急切地加載。
Auth::user()
因此,如果我有時呼叫控制器中的方法,我會嘗試了解它是如何作業的:
public function controllerMethod(){
Auth::user()->tags();
/// Some logic
Auth::user()->id;
// Some logic
Auth::user()->tags();
}
它是在資料庫中創建三個相同的請求還是兩個相同的請求和一個附加的帶有標簽的請求?
如果是的話,如何在全域分數中添加它,因為我需要Auth::user()
在應用程式中的每個地方獲取物件以顯示用戶欄位。
uj5u.com熱心網友回復:
User()::with()
實際上是一個錯誤:
呼叫未定義的函式 User()
正確的語法是User::with()
??
with()
告訴 Laravel 的 Eloquent在執行查詢時要包含哪些關系。就其本身而言,User::with('author')
不會做太多事情。當你使用閉包時,比如->get()
or ->first()
,它會執行一個子查詢,比如:
SELECT * FROM authors WHERE user_id IN (...)
IN (...)
如果您正在加載單個User
via->first()
或多個User
實體 via ,則該子句將發生變化->get()
,但它->author
不需要呼叫新的資料庫查詢。每個$user->author
屬性都將填充一個Author
實體,或者null
(如果User
沒有Author
等)
這是一個簡單的例子:
// Executes a single query to load each `User`
// Total Queries: 1
$users = User::get();
// Executes a new query on each loop
// Total Queries: 0 - ∞ (depends on number of loaded `User` instances)
foreach ($users as $user) {
$user->author->name;
}
// Executes a single Query to load each `User`, then a single subquery to load each `Author`
// Total Queries: 2
$users = User::with('author')->get();
foreach ($users as $user) {
$user->author->name;
}
當您呼叫 時auth()->user()
,它會回傳一個User
已從資料庫加載的實體。呼叫auth()->user()->author
將執行一個新的查詢,因為User
回傳的 viaauth()->user()
不包含->with('author')
.
如果您想在User
已經從資料庫中加載的關系上急切加載關系,您可以呼叫->load('author')
:
// Load the `User` instance from the database for the Authenticated User
$user = auth()->user();
// Executes the subquery `SELECT * FROM authors WHERE user_id = ?`
$user->load('author');
$user->author->name;
// Total Queries: 2
一個問題,如果你使用->author()
(with ()
),它會執行一個新的資料庫查詢,即使你已經呼叫了->load('author')
(or ->with('author')
):
$user = auth()->user();
$user->load('author'); // Subquery
$user->author()->first()->name; // ANOTHER Subquery
// Total Queries: 3
因此,總而言之,它->with()
將使訪問關系作為屬性,->author
(property) vs ->author()->first()
(method),不包括另一個 Subquery。如果省略->with('author')
,則兩者->author
和->author()->first()
都將執行 Subquery。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517411.html
標籤:拉拉维尔