关联模型可以非常简便的操作多种关联表的增、删、查、改。
模型简介
关联模型,一共有三种模式。
一对一:ONE_TO_ONE
,包括HAS_ONE和BELONGS_TO
;
一对多:ONE_TO_MANY
,包括HAS_MANY
和BELONGS_TO
;
多对多:MANY_TO_MANY
.
用表关系来理解这三种模式:
一对一:用户表和身份证表,一个用户只能对应一个身份证,而一个身份证只能对应一个用户。这就是一对一。
一对多:用户表和留言表,一个用户可以发表N条留言,而多条留言只能由某一个用户发表。这就是一对多。就算有多个用户发表了相同的留言内容,但是ID不一样,所以不能理解为多对多。
多对多:用户表和角色表,一个用户可以是认证专员,同时也是审核专员,那么角色表中的审核专员也可以是张三的角色,也可以是李四的角色,这就是多对多。
关联操作
用户表和身份证表关联,HAS_ONE
(一对一),表示一个用户只有一个身份证。
//User控制器部分
namespace Home\Controller;
use Think\Controller;
use Home\Model\UserModel;
class UserController extends Controller {
public function index() {
$user = D('User');
$arr = $user->relation(true)->select();
var_dump($arr);
}
}
//User模型部分
namespace Home\Model;
use Think\Model;
use Think\Model\RelationModel;
class UserModel extends RelationModel {
protected $_link = array(
'Card'=>array(
'mapping_type'=>self::HAS_ONE,
'class_name'=>'Card',
'mapping_name'=>'card',
'foreign_key'=>'uid',
'mapping_fields'=>'code',
'as_fields'=>'code',
'condition'=>'id=1',
),
);
}
HAS_ONE 支持以下属性
属性
class_name 关联的模型类名,如果不写,会自动定位相关数据表。
mapping_name 关联映射名称,用于获取数据的数组名。
mapping_type 设置关联模式,比如一对一self::HAS_ONE。
foreign_key 关联外键的名称,会自动对应当前数据表的id。
mapping_fields 关联要查询的字段,默认是查询所有。
as_fields 关联的字段映射成同级的字段。
condition 关联条件,额外查询使用。
用户表和身份证表关联,BELONGS_TO(一对一),表示一个身份证从属于一个用户。
//Card控制器部分
namespace Home\Controller;
use Think\Controller;
use Home\Model\CardModel;
class CardController extends Controller {
public function index() {
$card = D('Card');
$arr = $card->relation(true)->select();
var_dump($arr);
}
}
//Card模型部分
namespace Home\Model;
use Think\Model;
use Think\Model\RelationModel;
class CardModel extends RelationModel {
protected $_link = array(
'User'=>array(
'mapping_type'=>self::BELONGS_TO,
'foreign_key'=>'uid',
'mapping_fields'=>'user',
'as_fields'=>'user',
),
);
}
用户表和留言表:HAS_MANY(一对多)表示一个用户发表N 条留言。
namespace Home\Controller;
use Think\Controller;
use Home\Model\UserModel;
//User控制器部分
class UserController extends Controller {
public function index() {
$user = D('User');
$arr = $user->relation(true)->select();
print_r($arr);
}
}
namespace Home\Model;
use Think\Model;
use Think\Model\RelationModel;
//User模型部分
class UserModel extends RelationModel {
protected $_link = array(
'Content'=>array(
'mapping_type'=>self::HAS_MANY,
'mapping_name'=>'contents',
'class_name'=>'Content',
'foreign_key'=>'uid',
'mapping_fields'=>'content',
'mapping_limit'=>'0,2',
'mapping_order'=>'id DESC',
),
);
}
PS:如果使用HAS_MANY,还支持mapping_limit 和mapping_order 功能。
用户表和留言表:BELONGS_TO(多对一)表示N 条留言从属于某个用户。
namespace Home\Controller;
use Think\Controller;
use Home\Model\ContentModel;
class ContentController extends Controller {
public function index() {
$content = D('Content');
$arr = $content->relation(true)->select();
var_dump($arr);
}
}
namespace Home\Model;
use Think\Model\RelationModel;
class ContentModel extends RelationModel {
protected $_link = array(
'User'=>array(
'mapping_type'=>self::BELONGS_TO ,
'class_name'=>'User',
'foreign_key'=>'uid',
'mapping_name'=>'user',
'mapping_fields'=>'user',
'as_fields'=>'user',
),
);
}
PS:多对一的使用和一对一是一样的。