> ## 多態一對多關聯
> 描述:有書籍表、文章表、評論表三張表,書籍可以有多個評論,文章也可以有多個評論
> ### morphMany('關聯模型名','多態字段信息','多態類型');
>1. 關聯模型名(必須):關聯的模型名稱,可以使用模型名(如Comment)或者完整的命名空間模型名(如app\index\model\Comment)。
>2. 多態字段信息(可選):支持兩種方式定義 如果是字符串表示多態字段的前綴(如commentable),多態字段使用 多態前綴_type和多態前綴_id,如果是數組,表示使用['多態類型字段名','多態ID字段名'],默認為當前的關聯方法名作為字段前綴。
>3. 多態類型(可選):當前模型對應的多態類型,默認為當前模型名,可以使用模型名(如Article)或者完整的命名空間模型名(如app\index\model\Article)
假設表的結構如下:
> ### morphTo('多態字段信息',['多態類型別名']);
> 1. 多態字段信息(可選):支持兩種方式定義 如果是字符串表示多態字段的前綴,多態字段使用 多態前綴_type和多態前綴_id,如果是數組,表示使用['多態類型字段名','多態ID字段名'],默認為當前的關聯方法名作為字段前綴
>2. 多態類型別名(可選):數組方式定義
```
article
id - integer-文章id
title - string-文章標題
content - text- 文章內容
book
id - integer-書籍id
title - string-書籍名稱
comment
id - integer-評論id
content - text-評論內容
commentable_id - integer (文章|書籍)id
commentable_type - string 評論的類型(文章|書籍)
```
### 關聯定義
```
// 文章多態關聯定義
class Article extends Model
{
/**
* 獲取所有針對文章的評論。
*/
public function comments()
{
return $this->morphMany('Comment', 'commentable');
}
}
// 書籍多態關聯定義
class Book extends Model
{
/**
* 獲取所有針對書籍的評論。
*/
public function comments()
{
return $this->morphMany('Comment', 'commentable');
}
}
// 評論多態關聯定義
class Comment extends Model
{
/**
* 獲取評論對應的多態模型。
*/
public function commentable()
{
// 默認以模型名作為多態表類型(commentable_type)的劃分,如Article,Book
return $this->morphTo();
// 可以手動設置多態表類型名
return $this->morphTo('commentable',[
'book' => 'app\index\model\Book',
'post' => 'app\admin\model\Article',
]);
}
}
```
### 關聯查找
```
// 查找文章對應的評論
$article = Article::get(1);
foreach ($article->comments as $comment) {
dump($comment);
}
// 查找評論所屬的類型(文章|書籍)
$comment = Comment::get(1);
$commentable = $comment->commentable;
```
> ## 多態一對一關聯
> 描述:有成員表、團隊表和頭像表三張表,成員可以有一個頭像,團隊也可以有一個頭像
> ### morphOne('關聯模型名','多態字段信息','多態類型');
> 1. 關聯模型名(必須):關聯的模型名稱,可以使用模型名(如Avatar)或者完整的命名空間模型名(如app\index\model\Avatar)。
>2. 多態字段信息(可選):支持兩種方式定義 如果是字符串表示多態字段的前綴(如imageable),多態字段使用 多態前綴_type和多態前綴_id,如果是數組,表示使用['多態類型字段名','多態ID字段名'],默認為當前的關聯方法名作為字段前綴。
>3. 多態類型(可選):當前模型對應的多態類型,默認為當前模型名,可以使用模型名(如Member)或者完整的命名空間模型名(如app\index\model\Member)。
```
member
id - integer - 成員id
name - string - 成員姓名
team
id - integer - 團隊id
name - string - 團隊名稱
avatar
id - integer - 頭像id
avatar - string - 頭像路徑
imageable_id - integer - (成員|團隊)id
imageable_type - string - 頭像類型(成員|團隊)
```
### 關聯定義
```
// 成員多態關聯定義
class Member extends Model
{
/**
* 獲取用戶的頭像
*/
public function avatar()
{
return $this->morphOne('Avatar', 'imageable');
}
}
// 團隊多態關聯定義
class Team extends Model
{
/**
* 獲取團隊的頭像
*/
public function avatar()
{
return $this->morphOne('Avatar', 'imageable');
}
}
// 頭像多態關聯定義
class Avatar extends Model
{
/**
* 獲取頭像對應的多態模型。
*/
public function imageable()
{
return $this->morphTo();
}
}
```
- 運行環境需求
- tp5目錄結構
- 命令行生成代碼
- 路由
- 請求
- 獲取請求信息
- 超全局變量獲取
- 更改請求變量的值
- 判斷是否為某種請求類型
- 偽裝表單請求類型
- HTTP頭部信息
- 偽靜態
- 向請求對象中注入自定義的屬性和方法
- 簡單的傳參可以使用參數綁定
- 依賴注入(將對象注入方法作為參數)
- 將請求的數據進行緩存
- 控制器
- 一個控制器代碼示例
- 空控制器
- 資源控制器
- 模型
- 一個模型代碼示例
- 模型的四種調用方法
- 控制器中調用模型添加數據
- 控制器中調用模型更新數據
- 控制器中調用模型刪除數據
- 控制器中調用模型查詢數據
- 模型中使用聚合函數
- 獲取器
- 修改器
- 自動寫入時間戳
- 只讀字段
- 軟刪除
- 自動類型轉換
- 數據自動完成
- 查詢范圍
- 數組方式訪問和轉換為數組
- json序列化
- 模型的事件
- 關聯模型
- 一對一關聯
- 一對多關聯
- 遠程一對多(跨表關聯)
- 多對多關聯
- 多態關聯
- 關聯預載入N+1次查詢變2次
- 延遲預載入
- 關聯統計
- 視圖與模板
- 模板引擎配置
- 分配數據到模板
- 輸出替換
- 模板中輸出變量
- 模板中輸出系統變量(配置常量超全局)
- 模板中輸出請求信息
- 模板中使用php函數
- 輸出到模板中的變量指定默認值
- 模板中進行運算
- 原樣輸出代碼不解析
- 模版中注釋
- 模板布局與繼承
- 文件包含
- 內置標簽
- 循環輸出標簽
- 比較標簽
- 條件判斷標簽
- 引入資源文件(js-css)
- 使用原生php
- 在模板中定義變量和常量
- 助手函數
- 常用功能
- 表單驗證
- 驗證器的定義
- 自定義驗證規則
- 速查表
- 系統默認根命名空間
- 系統路徑常量
- 請求變量
- URL請求和信息方法