ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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");`