# 關聯操作
### 介紹
數據庫表通常相互關聯。例如,博客文章可能有很多評論,或者訂單可能與放置它的用戶有關。October使管理和使用這些關系變得容易,并支持幾種不同類型的關系。
> **注:**如果您在查詢中選擇特定的列和要加載的關系為好,你需要確保做出包含密鑰數據(即列`id`,`foreign_key`等等)都包含在你的SELECT語句。否則,十月無法建立聯系。
### [](https://octobercms.com/docs/database/relations#relationship-types)關系類型
可以使用以下關系類型:
* [一對一](https://octobercms.com/docs/database/relations#one-to-one)
* [一對多](https://octobercms.com/docs/database/relations#one-to-many)
* [多對多](https://octobercms.com/docs/database/relations#many-to-many)
* [有很多通過](https://octobercms.com/docs/database/relations#has-many-through)
* [多態關系](https://octobercms.com/docs/database/relations#polymorphic-relations)
* [多對多態關系](https://octobercms.com/docs/database/relations#many-to-many-polymorphic-relations)
### [](https://octobercms.com/docs/database/relations#deferred-binding)延遲綁定
延遲綁定允許您推遲模型關系的綁定,直到主記錄提交更改為止。如果您需要準備一些模型(例如文件上傳)并將它們與尚不存在的其他模型相關聯,則這特別有用。
您可以使用**會話密鑰將**任何數量的**從屬**模型相對于**主**模型進行延遲。當主記錄與會話密鑰一起保存時,與從屬記錄的關系將自動為您更新。后端[Form行為](https://octobercms.com/docs/backend/form)自動支持延遲綁定,但是您可能希望在其他地方使用此功能。[](https://octobercms.com/docs/backend/form)
### [](https://octobercms.com/docs/database/relations#deferred-session-key)生成會話密鑰
會話密鑰對于延遲綁定是必需的。您可以將會話密鑰視為事務標識符。相同的會話密鑰應用于綁定/解除綁定關系并保存主模型。您可以使用PHP`uniqid()`函數生成會話密鑰。請注意,[表單幫助程序](https://octobercms.com/docs/cms/markup#forms)會自動生成一個包含會話密鑰的隱藏字段。
~~~
$sessionKey = uniqid('session_key', true);
~~~
### [](https://octobercms.com/docs/database/relations#defer-binding)推遲關系綁定
除非保存該帖子,否則下一個示例中的評論將不會添加到該帖子中。
~~~
$comment = new Comment;
$comment->content = "Hello world!";
$comment->save();
$post = new Post;
$post->comments()->add($comment, $sessionKey);
~~~
> **注意**:該`$post`對象尚未保存,但是如果保存發生關系將被創建。
### [](https://octobercms.com/docs/database/relations#defer-unbinding)推遲解除關系
除非保存該帖子,否則下一個示例中的評論將不會被刪除。
~~~
$comment = Comment::find(1);
$post = Post::find(1);
$post->comments()->remove($comment, $sessionKey);
~~~
### [](https://octobercms.com/docs/database/relations#list-all-bindings)列出所有綁定
使用`withDeferred`關系的方法加載所有記錄,包括延遲的。結果還將包括現有關系。
~~~
$post->comments()->withDeferred($sessionKey)->get();
~~~
### [](https://octobercms.com/docs/database/relations#cancel-all-bindings)取消所有綁定
取消延遲綁定并刪除從屬對象而不是將它們保留為孤立對象是個好主意。
~~~
$post->cancelDeferred($sessionKey);
~~~
### [](https://octobercms.com/docs/database/relations#commit-all-bindings)提交所有綁定
保存主模型時,可以通過為會話密鑰提供方法的第二個參數來提交(綁定或取消綁定)所有延遲的綁定`save`。
~~~
$post = new Post;
$post->title = "First blog post";
$post->save(null, $sessionKey);
~~~
相同的方法適用于模型的`create`方法:
~~~
$post = Post::create(['title' => 'First blog post'], $sessionKey);
~~~
### [](https://octobercms.com/docs/database/relations#lazily-commit-bindings)延遲提交綁定
如果`$sessionKey`在保存時無法提供,則可以使用以下代碼隨時提交綁定:
~~~
$post->commitDeferred($sessionKey);
~~~
### [](https://octobercms.com/docs/database/relations#cleanup-bindings)清理孤立的綁定
銷毀所有尚未提交且早于1天的綁定:
~~~
October\Rain\Database\Models\DeferredBinding::cleanUp(1);
~~~
> **注意:**十月會自動銷毀早于5天的延遲綁定。后端用戶登錄系統時會發生這種情況。
### [](https://octobercms.com/docs/database/relations#disable-deferred-binding)禁用延遲綁定
有時您可能需要完全禁用給定模型的延遲綁定,例如,如果要從單獨的數據庫連接中加載它。為此,您需要確保在運行內部save方法中的遞延綁定鉤子之前和之后,模型的`sessionKey`屬性是正確`null`的。為此,您可以綁定到模型的`model.saveInternal`事件:
~~~
public function __construct()
{
$result = parent::__construct(...func_get_args());
$this->bindEvent('model.saveInternal', function () {
$this->sessionKey = null;
});
return $result;
}
~~~
> **注意:**這將完全禁用對您應用此替代的任何模型的延遲綁定。
- 基本說明
- 基本操作
- 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 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖