通常我们所说的关联关系包括下面三种:
☆ 一对一关联:ONE_TO_ONE,包括HAS_ONE和BELONGS_TO
☆ 一对多关联:ONE_TO_MANY,包括HAS_MANY和BELONGS_TO
☆ 多对多关联:MANY_TO_MANY
关联关系必然有一个参照表,例如:
有一个用户注册表xp_user和一个用户信息表xp_info
xp_user有用户的账号、密码
xp_info记录用户的基本信息 有标题、信息
一、我们首先来说说HAS_ONE关联
首先要建立一个UserModel模型
UserModel模型:
<?php
class UserModel extends RelationModel { //这地方要继承RelationModel
protected $_link = array ( //所有的关联定义都统一记录在模型类的$_link里面
' Info ' => array ( //关联的表名
' mapping_type ' => HAS_ONE , //关联类型
' class_mame ' => ' Info ' , //需要关联的模型类名
' mapping_name ' => ' Info ' , //关联的映射名称,用于获取数据用
' foreign_key ' => ' uid ' , //关联的外键名称
//'mapping_fields'=>'uid,title,info', //关联要查询的字段
' as_fields ' => ' uid,title,info:message ' , //直接把关联的字段值映射成数据对象中的某个字段
) ,
) ;
}
?>
class UserModel extends RelationModel { //这地方要继承RelationModel
protected $_link = array ( //所有的关联定义都统一记录在模型类的$_link里面
' Info ' => array ( //关联的表名
' mapping_type ' => HAS_ONE , //关联类型
' class_mame ' => ' Info ' , //需要关联的模型类名
' mapping_name ' => ' Info ' , //关联的映射名称,用于获取数据用
' foreign_key ' => ' uid ' , //关联的外键名称
//'mapping_fields'=>'uid,title,info', //关联要查询的字段
' as_fields ' => ' uid,title,info:message ' , //直接把关联的字段值映射成数据对象中的某个字段
) ,
) ;
}
?>
UserAction控制器:
<?php
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$list = $user -> relation ( true ) -> find () ; //由于性能问题,新版本取消了自动关联查询机制,而统一使用relation方法进行关联操作
dump ( $list ) ;
}
}
?>
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$list = $user -> relation ( true ) -> find () ; //由于性能问题,新版本取消了自动关联查询机制,而统一使用relation方法进行关联操作
dump ( $list ) ;
}
}
?>
输入结果如下:
二、一对多关联HAS_MANY
user表仍是一条数据
info表增加一条数据
UserModel模型:
<?php
class UserModel extends RelationModel { //这地方要继承RelationModel
protected $_link = array ( //所有的关联定义都统一记录在模型类的$_link里面
' Info ' => array ( //关联的表名
' mapping_type ' => HAS_MANY , //关联类型 一对多关联
' class_mame ' => ' Info ' , //需要关联的模型类名
' mapping_name ' => ' Info ' , //关联的映射名称,用于获取数据用
' foreign_key ' => ' uid ' , //关联的外键名称
//'mapping_fields'=>'uid,title,info', //关联要查询的字段
' as_fields ' => ' uid,title,info:message ' , //直接把关联的字段值映射成数据对象中的某个字段
//一对多关联这地方增加了几个参数
//mapping_limit 关联要返回的记录条数
//mapping_order 关联查询的顺序
) ,
) ;
}
?>
class UserModel extends RelationModel { //这地方要继承RelationModel
protected $_link = array ( //所有的关联定义都统一记录在模型类的$_link里面
' Info ' => array ( //关联的表名
' mapping_type ' => HAS_MANY , //关联类型 一对多关联
' class_mame ' => ' Info ' , //需要关联的模型类名
' mapping_name ' => ' Info ' , //关联的映射名称,用于获取数据用
' foreign_key ' => ' uid ' , //关联的外键名称
//'mapping_fields'=>'uid,title,info', //关联要查询的字段
' as_fields ' => ' uid,title,info:message ' , //直接把关联的字段值映射成数据对象中的某个字段
//一对多关联这地方增加了几个参数
//mapping_limit 关联要返回的记录条数
//mapping_order 关联查询的顺序
) ,
) ;
}
?>
UserAction控制器:
<?php
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$list = $user -> relation ( true ) -> select () ;
dump ( $list ) ;
}
}
?>
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$list = $user -> relation ( true ) -> select () ;
dump ( $list ) ;
}
}
?>
输出结果:
一对一和一对多 基本一样、只要会一对一 一对多很容易
三、关联操作 CURD
1.以一对多模型为例,向数据库插入数据
UserAction.class.php
'
title111111
'
,
'
info
'
=>
'
info11111111
'
),
//这里的info是字段
array ( ' title ' => ' title222222222 ' , ' info ' => ' info222222222 ' ) ,
);
$user -> relation ( true ) -> add ( $data ) ;
}
}
?>
array ( ' title ' => ' title222222222 ' , ' info ' => ' info222222222 ' ) ,
);
$user -> relation ( true ) -> add ( $data ) ;
}
}
?>
运行结果:
2.修改这条数据
UserAction.class.php
<?php
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$data [ ' username ' ] = ' demo ' ;
$data [ ' userpwd ' ] = ' mima ' ;
$data [ ' Info ' ] = array (
array ( ' id ' => ' 5 ' , ' title ' => ' demo111111 ' , ' info ' => ' demo111111 ' ) , //这地方跟add不同 需要加修改的ID
array ( ' id ' => ' 6 ' , ' title ' => ' demo2222222 ' , ' info ' => ' demo2222222 ' ) ,
) ;
$user -> relation ( true ) -> where ( ' id=16 ' ) -> save ( $data ) ;
}
}
?>
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$data [ ' username ' ] = ' demo ' ;
$data [ ' userpwd ' ] = ' mima ' ;
$data [ ' Info ' ] = array (
array ( ' id ' => ' 5 ' , ' title ' => ' demo111111 ' , ' info ' => ' demo111111 ' ) , //这地方跟add不同 需要加修改的ID
array ( ' id ' => ' 6 ' , ' title ' => ' demo2222222 ' , ' info ' => ' demo2222222 ' ) ,
) ;
$user -> relation ( true ) -> where ( ' id=16 ' ) -> save ( $data ) ;
}
}
?>
运行结果:
3.删除这条数据
<?php
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$user -> relation ( true ) -> delete ( 16 ) ;
}
}
?>
class UserAction extends Action {
public function index (){
$user = D ( ' User ' ) ;
$user -> relation ( true ) -> delete ( 16 ) ;
}
}
?>