### [](https://octobercms.com/docs/database/relations#eager-loading)渴望加載
當訪問關系作為屬性時,關系數據是“延遲加載”的。這意味著直到您首次訪問該屬性,關系數據才被實際加載。但是,在查詢父模型時,模型可以“渴望加載”關系。較早的加載減輕了N + 1查詢問題。為了說明N + 1查詢問題,請考慮`Book`與以下相關的模型`Author`:
~~~
class Book extends Model
{
public $belongsTo = [
'author' => ['Acme\Blog\Models\Author']
];
}
~~~
現在,讓我們檢索所有書籍及其作者:
~~~
$books = Book::all();
foreach ($books as $book) {
echo $book->author->name;
}
~~~
此循環將執行1個查詢以檢索表上的所有書籍,然后對每個書籍執行另一個查詢以檢索作者。因此,如果我們有25本書,則此循環將運行26個查詢:1個查詢原始圖書,另外25個查詢檢索每本書的作者。
值得慶幸的是,我們可以使用緊急加載將此操作減少為僅2個查詢。查詢時,您可以使用以下`with`方法指定應該急切加載的關系:
~~~
$books = Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
~~~
對于此操作,將僅執行兩個查詢:
~~~
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
~~~
#### 渴望加載多個關系
有時,您可能需要在單個操作中急于加載幾個不同的關系。為此,只需將其他參數傳遞給該`with`方法:
~~~
$books = Book::with('author', 'publisher')->get();
~~~
#### 嵌套的渴望加載
要渴望加載嵌套關系,可以使用“點”語法。例如,讓我們熱切地在一個聲明中加載本書的所有作者和所有作者的個人聯系人:
~~~
$books = Book::with('author.contacts')->get();
~~~
### [](https://octobercms.com/docs/database/relations#constraining-eager-loads)限制渴望的負荷
有時您可能希望渴望加載一個關系,但同時為渴望加載查詢指定其他查詢約束。這是一個例子:
~~~
$users = User::with([
'posts' => function ($query) {
$query->where('title', 'like', '%first%');
}
])->get();
~~~
在此示例中,只有帖子的`title`列中包含單詞,模型才會渴望加載帖子`first`。當然,您可以調用其他[查詢構建器](https://octobercms.com/docs/database/query)方法來進一步自定義急切的加載操作:
~~~
$users = User::with([
'posts' => function ($query) {
$query->orderBy('created_at', 'desc');
}
])->get();
~~~
### [](https://octobercms.com/docs/database/relations#lazy-eager-loading)懶惰的渴望加載
有時您可能需要在已檢索父模型之后急于加載關系。例如,如果您需要動態決定是否加載相關模型,這可能會很有用:
~~~
$books = Book::all();
if ($someCondition) {
$books->load('author', 'publisher');
}
~~~
如果您需要在預加載查詢中設置其他查詢約束,則可以將傳遞`Closure`給`load`方法:
~~~
$books->load([
'author' => function ($query) {
$query->orderBy('published_date', 'asc');
}
]);
~~~
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖