日期:2014-05-16  浏览次数:20390 次

ThinkPHP学习笔记(十八)数据库表的关联操作

RelateAction

<?php
/**
 * ThinkPHP中的
 * 一对一:
 * 		有:HAS.ONE 属于:BELONGS.TO
 * 一对多:
 * 		有:HAS.MANY 属于:BELONGS.TO
 * 多对多:
 * 		MANY.TO.MANY
 * 
 * 如果加入关联需要加入relation方法并将其设为true
 * 同时Model需要继承RelationModel
 */
class RelateAction extends Action{
	public function index(){
		$user=D('User');
		//HAS_ONE和HAS_MANY
		//1.查询
		//如果加入关联需要加入relation方法并将其设为true
		//同时Model需要继承RelationModel
//		$list=$user->relation(true)->select();
		
		//2.插入
//		$data['username']='student';
//		$data['password']='student';
//		$data['card']=array(
//			array('cardname'=>'student1'),
//			array('cardname'=>'student2'),
//		);
//		$list=$user->relation(true)->add($data);

		//3.更新
//		$data['username']='user';
//		$data['password']='user';
//		$data['card']=array(
//			//作更新的时候,需要加入需要更新的card对应的id
//			array('id'=>1,'cardname'=>'修改1'),
//			array('id'=>2,'cardname'=>'修改2'),
//		);
//		$list=$user->relation(true)->where('id=1')->save($data);
		
		//4.删除
//		$list=$user->relation(true)->delete('23');
		dump($list);
	}
	public function belongs(){
		$card=D('Card');
		$list=$card->relation(true)->select();
		dump($list);
	}
}
?>

HAS关系:(主要看$link的设置)

<?php
class UserModel extends RelationModel {
	//参数:
	//1.验证字段(表单中的名称或者辅助字段例如验证码)
	//2.验证规则(结合附加规则一起使用)
	//3.错误提醒
	//4.验证条件(0:1:2:)最好是选择手册中的常量来填写
	//5.附加规则;验证方式:regex;function名;callback;confirm(验证两个字段是否相同);equal;in;unique;
	//				常用规则:require:必须存在;email邮箱;url;currency货币;number;
	//6.验证时间
	//				是指数据库进行数据库操作时的验证时机(增加数据时,编辑时,全部清空下验证)
	//				Model::MODEL_INSERT
	//				Model::MODEL_UPDATE
	//				Model::MODEL_BOTH
	//自动验证开始
	protected $_validate = array (//在模型中添加国际化
	array ('username', 'require', '<!--{%usernamenull}-->', 0, 0, 1 ), array ('username', 'checklen', '用户名长度不合法', 0, 'callback', 3 ), array ('password', 'require', '用户名必填', 0, 0, 1 ), array ('repassword', 'require', '用户名必填', 0, 0, 1 ), array ('password', 'repassword', '密码不一致', 0, 'confirm', 1 ) )//			array('createip','email','邮箱格式不对',0,'regex',1),
	;
	//可以设置多个关联
	protected $_link = array (
		//'condition'
		//foreign_key
		//mapping_fields 需要关联的字段
		//as_fields 
		'card' => array (
			//HAS_ONE其他的只是修改关系;
			//HAS_MANY:多了mapping_limit、mapping_order、parent_key(自引用关联的字段,默认为parent_id)
			'mapping_type' => HAS_MANY, 
			'class_name' => 'card', 
			'mapping_name' => 'card', 
			'foreign_key' => 'uid' ,
			'mapping_fields' => array('id','uid','cardname'), 
//			'mapping_fields' => 'id,uid,cardname',
			//默认是card是属于user之下的,查询出来是一个二维数组;as_fields可以将想显示的字段放入到一维数组当中  
			'as_fields' => 'id:usid,cardname', 
		)
	 );
	public function checklen($data) {
		if (strlen ( $data ) > 15 || strlen ( $data ) < 5)
			return FALSE;
		return true;
	}
	function modelTest() {
		echo '测试的跨模型操作,调用模型中的方法';
	}
}
?>

Belongs(属于关系,操作字表)

<?php
class CardModel extends RelationModel {
	//可以设置多个关联;多个'' => array();
	protected $_link = array (
		'user' => array (
			'mapping_type' => BELONGS_TO, 
			//card本身的uid
			'foreign_key' => 'uid' ,
		)
	 );
}
?>