thinkphp 关联模型学习笔记
2016-03-10 22:41
886 查看
参考原文地址:http://document.thinkphp.cn/manual_3_2.html#relation_model
一对一关联 :包括HAS_ONE 和 BELONGS_TO
一对多关联 :包括HAS_MANY 和 BELONGS_TO
多对多关联 :MANY_TO_MANY
关联定义的格式是:
3.2.2版本开始,relation_table定义支持简化写法,例如:
输出:
如果我们按照下面的方式定义了
查询的结果就变成了下面的结果:
同样,可以使用参数来控制要关联写入数据:
关联更新数据:
关联删除数据:
关联定义
ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:HAS_ONE、BELONGS_TO、HAS_MANY、MANY_TO_MANY一对一关联 :包括HAS_ONE 和 BELONGS_TO
一对多关联 :包括HAS_MANY 和 BELONGS_TO
多对多关联 :MANY_TO_MANY
关联定义的格式是:
namespace Home\Model; use Think\Model\RelationModel; class UserModel extends RelationModel{ protected $_link = array( '关联1' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), '关联2' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), '关联3' => HAS_ONE, // 快捷定义 ... ); }
HAS_ONE
namespace Home\Model; use Think\Model\RelationModel; class UserModel extends RelationModel{ protected $_link = array( 'Profile'=>array( 'mapping_type' => self::HAS_ONE, 'class_name' => 'Profile', // 定义更多的关联属性 …… ), ); }
属性 | 描述 |
---|---|
mapping_type | 关联类型 |
class_name | 要关联的模型类名 |
mapping_name | 关联的映射名称,用于获取数据用 |
foreign_key | 关联的外键名称 |
condition | 关联条件 |
mapping_fields | 关联要查询的字段 |
as_fields | 直接把关联的字段值映射成数据对象中的某个字段 |
BELONGS_TO
'Dept' => array( 'mapping_type' => self::BELONGS_TO, 'class_name' => 'Dept', 'foreign_key' => 'userId', 'mapping_name' => 'dept', // 定义更多的关联属性 …… ),
属性 | 描述 |
---|---|
class_name | 要关联的模型类名 |
mapping_name | 关联的映射名称,用于获取数据用 该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。 |
foreign_key | 关联的外键名称 |
mapping_fields | 关联要查询的字段 |
condition | 关联条件 |
parent_key | 自引用关联的关联字段 默认为parent_id 自引用关联是一种比较特殊的关联,也就是关联表就是当前表。 |
as_fields | 直接把关联的字段值映射成数据对象中的某个字段 |
HAS_MANY
'Article' => array( 'mapping_type' => self::HAS_MANY, 'class_name' => 'Article', 'foreign_key' => 'userId', 'mapping_name' => 'articles', 'mapping_order' => 'create_time desc', // 定义更多的关联属性 …… ),
属性 | 描述 |
---|---|
class_name | 要关联的模型类名 |
mapping_name | 关联的映射名称,用于获取数据用 该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。 |
foreign_key | 关联的外键名称 |
parent_key | 自引用关联的关联字段 默认为parent_id |
condition | 关联条件 关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。 |
mapping_fields | 关联要查询的字段 默认情况下,关联查询的关联数据是关联表的全部字段,如果只是需要查询个别字段,可以定义关联的mapping_fields属性。 |
mapping_limit | 关联要返回的记录数目 |
mapping_order | 关联查询的排序 |
MANY_TO_MANY
'Group' => array( 'mapping_type' => self::MANY_TO_MANY, 'class_name' => 'Group', 'mapping_name' => 'groups', 'foreign_key' => 'userId', 'relation_foreign_key' => 'groupId', 'relation_table' => 'think_group_user' //此处应显式定义中间表名称,且不能使用C函数读取表前缀 )
属性 | 描述 |
---|---|
class_name | 要关联的模型类名 |
mapping_name | 关联的映射名称,用于获取数据用 该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。 |
foreign_key | 关联的外键名称 外键的默认规则是当前数据对象名称_id |
relation_foreign_key | 关联表的外键名称 默认的关联表的外键名称是表名_id |
mapping_limit | 关联要返回的记录数目 |
mapping_order | 关联查询的排序 |
relation_table | 多对多的中间关联表名称,规则是:数据表前缀_关联操作的主表名_关联表名 |
'relation_table'=>'__USER_GROUP__'
关联查询
用User表关联Profile表,nickname为Profile表的字段
$User = D("User"); $user = $User->relation(true)->find(1); #也可以这样子写 $User = D("User"); $user = $User->relation('Profile')->find(1); #查询多个数据 $User = D("User"); $list = $User->relation(true)->Select();
输出:
array( 'id' => 1, 'account' => 'ThinkPHP', 'password' => '123456', 'Profile' => array( 'email' => 'liu21st@gmail.com', 'nickname' => '流年', ), )
如果我们按照下面的方式定义了
as_fields属性的话
protected $_link = array( 'Profile'=>array( 'mapping_type' => self::HAS_ONE, 'class_name' => 'Profile', 'foreign_key' => 'userId', 'as_fields' => 'email,nickname', ), );
查询的结果就变成了下面的结果:
array( 'id' => 1, 'account' => 'ThinkPHP', 'password' => 'name', 'email' => 'liu21st@gmail.com', 'nickname' => '流年', )
同样,可以使用参数来控制要关联写入数据:
$result = $User->relation("Profile")->add($data); #当MANY_TO_MANY时,不建议使用关联插入。
关联更新数据:
$result = $User->relation("Profile")->save($data);
关联删除数据:
//删除用户ID为3的记录的同时删除关联数据 $result = $User->relation(true)->delete("3"); // 如果只需要关联删除部分数据,可以使用 $result = $User->relation("Profile")->delete("3");
相关文章推荐
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- ThinkPHP关联模型操作实例分析
- thinkphp3.0 模板中函数的使用
- ThinkPHP采用<volist>实现三级循环代码实例
- Thinkphp模板标签if和eq的区别和比较实例分析
- 合并ThinkPHP配置文件以消除代码冗余的实现方法
- ThinkPHP中自定义目录结构的设置方法
- ThinkPHP控制器详解
- ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
- 解析thinkphp中的M()与D()方法的区别
- ThinkPHP采用模块和操作分析
- Thinkphp模板中使用自定义函数的方法
- linux下使用ThinkPHP需要注意大小写导致的问题
- ThinkPHP中FCKeditor编辑器的使用方法
- thinkphp的CURD和查询方式介绍
- THINKPHP支持YAML配置文件的设置方法
- Thinkphp中import的几个用法详细介绍
- 浅谈thinkphp的实例化模型
- ThinkPHP控制器里javascript代码不能执行的解决方法
- 最新ThinkPHP V5在iis、nginx、apache下的安装过程、包含伪静态引起的错误