您的位置:首页 > 编程语言 > PHP开发

thinkphp 关联模型学习笔记

2016-03-10 22:41 886 查看
参考原文地址:http://document.thinkphp.cn/manual_3_2.html#relation_model

关联定义

ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:HAS_ONEBELONGS_TOHAS_MANYMANY_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多对多的中间关联表名称,规则是:数据表前缀_关联操作的主表名_关联表名
3.2.2版本开始,relation_table定义支持简化写法,例如:

'relation_table'=>'__USER_GROUP__'


关联查询

用User表关联Profile表,
email
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thinkphp 关联模型