> ### 定义一对一关联
> 描述:一个用户有一份资料
> ## hasOne('关联的模型', '外键名', '主键名', 'join类型')
> 有一点需要注意的是,关联方法的命名规范是驼峰法,而关联属性则一般是小写+下划线的方式,系统在获取的时候会自动转换对应,读取user_profile关联属性则对应的关联方法应该是userProfile。
```
// 模型中这样定义
class User extends Model
{
// 一个User有一个Profile
public function profile()
{
// 定义关联(默认使用user_id作为外键进行关联)
return $this->hasOne('Profile');
// 如果外键为uid,则需要如此设置
return $this->hasOne('Profile','uid');
// 指定关联的字段
// 如果使用的是join方式的关联,不支持指定field字段
return $this->hasOne('Profile')->field('id,name,email');
// 绑定指定的字段到父模型(支持读取器)
return $this->hasOne('Profile','uid')->bind('nickname,email');
// 还可以给绑定到父模型的子模型字段指定别名
return $this->hasOne('Profile','uid')->bind([
'email',
'truename' => 'nickname',
'profile_id' => 'id',
]);
// 这样可以直接在控制器这样访问
$user = User::get(1,'profile');
// 输出Profile关联模型的email属性
echo $user->email;
echo $user->profile_id;
}
}
```
> ### 关联查找
```
// 获取关联的属性
$user = User::get(1);
echo $user->profile->email;
// 获取指定条件的关联属性
$user = User::hasWhere('profile',['email'=>'thinkphp@qq.com'])->find();
echo $user->name;
```
> ### 关联新增
```
$user = User::get(1);
// 如果还没有关联数据 则进行新增
$user->profile()->save(['email' => 'thinkphp']);
// 动态新增属性
$user = User::find(1);
$user->profile->phone = '1234567890';
$user->profile->save();
```
> ### 关联更新
```
$$user = User::get(1);
$user->profile->email = 'thinkphp';
$user->profile->save();
// 或者
$user->profile->save(['email' => 'thinkphp']);
```
> ## 定义反向关联
> ### belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');
```
// Profile属于User
class Profile extends Model
{
public function user()
{
// 默认关联的外键为user_id
return $this->belongsTo('User');
// 如果需要指定关联的外键
return $this->belongsTo('User','uid');
}
}
// 根据子模型获取父模型的数据
profile = Profile::get(1);
// 输出User关联模型的属性
echo $profile->user->account;
```
> ### 关联自动写入更新和删除
```
// 关联插入
$blog = new Blog;
$blog->name = 'thinkphp';
$content = new Content;
$content->data = '实例内容';
$blog->content = $content;
$blog->together('content')->save();
// 关联更新(同时更新当前模型与其关联模型)
$blog = Blog::get(1);
$blog->title = '更改标题';
$blog->content->data = '更新内容';
$blog->together('content')->save();
// 关联删除
$blog = Blog::get(1);
$blog->together('content')->delete();
```
- 运行环境需求
- tp5目录结构
- 命令行生成代码
- 路由
- 请求
- 获取请求信息
- 超全局变量获取
- 更改请求变量的值
- 判断是否为某种请求类型
- 伪装表单请求类型
- HTTP头部信息
- 伪静态
- 向请求对象中注入自定义的属性和方法
- 简单的传参可以使用参数绑定
- 依赖注入(将对象注入方法作为参数)
- 将请求的数据进行缓存
- 控制器
- 一个控制器代码示例
- 空控制器
- 资源控制器
- 模型
- 一个模型代码示例
- 模型的四种调用方法
- 控制器中调用模型添加数据
- 控制器中调用模型更新数据
- 控制器中调用模型删除数据
- 控制器中调用模型查询数据
- 模型中使用聚合函数
- 获取器
- 修改器
- 自动写入时间戳
- 只读字段
- 软删除
- 自动类型转换
- 数据自动完成
- 查询范围
- 数组方式访问和转换为数组
- json序列化
- 模型的事件
- 关联模型
- 一对一关联
- 一对多关联
- 远程一对多(跨表关联)
- 多对多关联
- 多态关联
- 关联预载入N+1次查询变2次
- 延迟预载入
- 关联统计
- 视图与模板
- 模板引擎配置
- 分配数据到模板
- 输出替换
- 模板中输出变量
- 模板中输出系统变量(配置常量超全局)
- 模板中输出请求信息
- 模板中使用php函数
- 输出到模板中的变量指定默认值
- 模板中进行运算
- 原样输出代码不解析
- 模版中注释
- 模板布局与继承
- 文件包含
- 内置标签
- 循环输出标签
- 比较标签
- 条件判断标签
- 引入资源文件(js-css)
- 使用原生php
- 在模板中定义变量和常量
- 助手函数
- 常用功能
- 表单验证
- 验证器的定义
- 自定义验证规则
- 速查表
- 系统默认根命名空间
- 系统路径常量
- 请求变量
- URL请求和信息方法