> ## 多态一对多关联
> 描述:有书籍表、文章表、评论表三张表,书籍可以有多个评论,文章也可以有多个评论
> ### 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请求和信息方法