关联表
最后更新于:2022-04-02 02:22:37
[TOC]
## 数据表关联,可以查询范围连用
### 一对一关联
```php
class MediaPublicModel extends RelationModel{
protected $_link=[
'read_adv_media'=>[
'mapping_type'=>self::HAS_ONE,
'foreign_key'=>'mid',
'mapping_fields'=>'id,name,wechat',
'as_fields'=>'wechat:wechat_username', //把关联的字段值映射成数据对象中的某个字段
//'class_name'=>'read_adv_media', //驼峰或者下滑线都可以都可以
//'condition'=>"name = cpj'", //复杂查询条件,用string ]
];
}
//1. 直接关联查选
$res = D("MediaPublic")->relation('read_adv_media')->where(['id'=>12306])->find();
//2. 选查询在关联
$mp = D("MediaPublic")->where(['id'=>12306]);
var_dump($mp->find());
var_dump($mp->relationGet('read_adv_media')); // 使用relationGet 在find后输出关联的read_adv_media中的字段
```
### 一对多关联
```
class BookModel extends RelationModel{
protected $_link=[
'book_episodes'=>[ //关联表名
'mapping_type'=>self::HAS_MANY,
'foreign_key'=>'bid',
'mapping_fields'=>'ji_no,title',
'mapping_limit'=>'20',
'mapping_order'=>'ji_no asc'
//'mapping_key'=>'id', 主表对管理表看到id,
//'condition'=>'', 复杂查询条件
]
}
```
### 关联添加
```
$mp = D("MediaPublic");
$data['fans']='130001';
$data['name']='cpj130001';
$data['read_adv_media']=[
'pv'=>'1000',
];
$mp->relation("read_adv_media")->add($data); //relation 的name只能是对应的link的值
```
### 关联更新
> **关联更新必须是主表的主键id 为子表的关联id,否则更新无效**
```
$mp = D("MediaPublic")->where(['id'=>'28805']);
$data['licai']='0';
$data['read_adv_media']=[
'pv'=>'1002',
'url'=>'http://www.baiducki.com',
];
$mp->relation("read_adv_media")->save($data); //relation 的name只能是对应的link的值
```
### 关联更新的规则
HAS_ONE: 关联数据的更新直接赋值
HAS_MANY: 的关联数据如果传入主键的值 则表示更新 否则就表示新增
MANY_TO_MANY: 的数据更新是删除之前的数据后重新写入
### 关联删除
`$result = $User->relation("Profile")->delete("3");`
';