`

thinkphp关联模型

阅读更多
thinkphp关联模型
HAS_ONE
HAS_ONE关联表示当前模型拥有一个子对象,例如,每个员工都有一个人事档案。我们可以建立一个用户模型UserModel,并且添加如下关联定义:
class UserModel extends RelationModel
{
         public $_link = array(
       'Profile'=> HAS_ONE,
);
}
上面是最简单的方式,表示其遵循了系统内置的数据库规范,完整的定义方式是:
class UserModel extends RelationModel
{
         public $_link = array(
        'Profile'=>array(
'mapping_type'    =>HAS_ONE,
                 'class_name'     =>'Profile',
                    // 定义更多的关联属性
                             ……
                  ),
);
}
关联HAS_ONE支持的关联属性有:
mapping_type关联类型,这个在HAS_ONE 关联里面必须使用HAS_ONE 常量定义。
class_name要关联的模型类名
例如,class_name 定义为Profile的话则表示和另外的Profile模型类关联,这个Profile模型类是无需定义的,系统会自动定位到相关的数据表进行关联。
mapping_name 关联的映射名称,用于获取数据用
该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。如果mapping_name没有定义的话,会取class_name的定义作为mapping_name。如果class_name也没有定义,则以数组的索引作为mapping_name。
foreign_key关联的外键名称
外键的默认规则是当前数据对象名称_id,例如:
UserModel对应的可能是表think_user (注意:think只是一个表前缀,可以随意配置)
那么think_user表的外键默认为 user_id,如果不是,就必须在定义关联的时候显式定义 foreign_key 。
condition关联条件
关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。
mapping_fields关联要查询的字段
默认情况下,关联查询的关联数据是关联表的全部字段,如果只是需要查询个别字段,可以定义关联的mapping_fields属性。
as_fields直接把关联的字段值映射成数据对象中的某个字段
这个特性是ONE_TO_ONE 关联特有的,可以直接把关联数据映射到数据对象中,而不是作为一个关联数据。当关联数据的字段名和当前数据对象的字段名称有冲突时,还可以使用映射定义。

BELONGS_TO
Belongs_to 关联表示当前模型从属于另外一个父对象,例如每个用户都属于一个部门。我们可以做如下关联定义。      
'Dept'=> BELONGS_TO
完整方式定义为:
'Dept'=> array( 
'mapping_type'=>BELONGS_TO,
                    'class_name'=>'Dept',
                    'foreign_key'=>'userId',
                    'mapping_name'=>'dept',
                    // 定义更多的关联属性
                             ……
                  ),

关联BELONGS_TO定义支持的关联属性有:
class_name要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。
foreign_key关联的外键名称
mapping_fields关联要查询的字段
condition关联条件
parent_key自引用关联的关联字段
默认为parent_id
自引用关联是一种比较特殊的关联,也就是关联表就是当前表。
as_fields直接把关联的字段值映射成数据对象中的某个字段

HAS_MANY
HAS_MANY 关联表示当前模型拥有多个子对象,例如每个用户有多篇文章,我们可以这样来定义:
'Article'=> HAS_MANY
完整定义方式为:
'Article'=> array( 
'mapping_type'=>HAS_MANY,
                    'class_name'=>'Article',
                    'foreign_key'=>'userId',
                    'mapping_name'=>'articles',
                    'mapping_order'=>'create_time desc',
                    // 定义更多的关联属性
                             ……
                  ),
关联HAS_MANY定义支持的关联属性有:
class_name要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。
foreign_key 关联的外键名称
外键的默认规则是当前数据对象名称_id,例如:
UserModel对应的可能是表think_user (注意:think只是一个表前缀,可以随意配置)
那么think_user表的外键默认为 user_id,如果不是,就必须在定义关联的时候定义 foreign_key 。
parent_key自引用关联的关联字段
默认为parent_id
condition 关联条件
关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。
mapping_fields关联要查询的字段
默认情况下,关联查询的关联数据是关联表的全部字段,如果只是需要查询个别字段,可以定义关联的mapping_fields属性。
mapping_limit关联要返回的记录数目
mapping_order关联查询的排序

MANY_TO_MANY
MANY_TO_MANY 关联表示当前模型可以属于多个对象,而父对象则可能包含有多个子对象,通常两者之间需要一个中间表类约束和关联。例如每个用户可以属于多个组,每个组可以有多个用户:
'Group'=> MANY_TO_MANY
完整定义方式为:
        array(    'mapping_type'=>MANY_TO_MANY,
                    'class_name'=>'Group',
                    'mapping_name'=>'groups',
                    'foreign_key'=>'userId',
                    'relation_foreign_key'=>'goupId',
                    'relation_table'=>'think_gourpUser')

MANY_TO_MANY支持的关联属性定义有:
class_name要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。
foreign_key关联的外键名称
外键的默认规则是当前数据对象名称_id,例如:
relation_foreign_key关联表的外键名称
默认的关联表的外键名称是表名_id
mapping_limit关联要返回的记录数目
mapping_order关联查询的排序
relation_table多对多的中间关联表名称
多对多的中间表默认表规则是:数据表前缀_关联操作的主表名_关联表名
如果think_user 和 think_group 存在一个对应的中间表,默认的表名应该是
如果是由group来操作关联表,中间表应该是 think_group_user,如果是从user表来操作,那么应该是think_user_group,也就是说,多对多关联的设置,必须有一个Model类里面需要显式定义中间表,否则双向操作会出错。
中间表无需另外的id主键(但是这并不影响中间表的操作),通常只是由 user_id 和 group_id 构成。
默认会通过当前模型的getRelationTableName方法来自动获取,如果当前模型是User,关联模型是Group,那么关联表的名称也就是使用 user_group这样的格式,如果不是默认规则,需要指定relation_table属性。

关联查询
由于性能问题,新版取消了自动关联查询机制,而统一使用relation方法进行关联操作,relation方法不但可以启用关联还可以控制局部关联操作,实现了关联操作一切尽在掌握之中。
$User = D("User");
$user =     $User->realtion(true)->find(1);
输出$user结果可能是类似于下面的数据:
array(
'id'                  =>     1,
'account'      =>     'ThinkPHP',
'password'   =>     '123456',
'Profile'         => array(
'email'                =>'liu21st@gmail.com',
'nickname'        =>'流年',
   ),
)
我们可以看到,用户的关联数据已经被映射到数据对象的属性里面了。其中Profile就是关联定义的mapping_name属性。
如果我们按照下面的凡事定义了as_fields属性的话,
         protected $_link = array(
        'profile'=>array(
'mapping_type'    =>HAS_ONE,
                    'class_name'   =>'Profile',
'foreign_key'=>'userId',
'as_fields'=>'email,nickname',
                  ),
);
查询的结果就变成了下面的结果
array(
'id'                  =>     1,
'account'      =>     'ThinkPHP',
'password'   =>     'name',
'email'           =>'liu21st@gmail.com',
'nickname'   =>'流年',
)
email和nickname两个字段已经作为user数据对象的字段来显示了。
如果关联数据的字段名和当前数据对象的字段有冲突的话,怎么解决呢?
我们可以用下面的方式来变化下定义:
'as_fields'=>'email,nickname:username',
表示关联表的nickname字段映射成当前数据对象的username字段。
默认会把所有定义的关联数据都查询出来,有时候我们并不希望这样,就可以给relation方法传入参数来控制要关联查询的。
$User = D("User");
$user =     $User->relation('Profile')->find(1);
关联查询一样可以支持select方法,如果要查询多个数据,并同时获取相应的关联数据,可以改成:
$User = D("User");
$list =       $User->relation(true)->Select();
如果希望在完成的查询基础之上 再进行关联数据的查询,可以使用
$User = D("User");
$user = $User->find(1);
// 表示对当前查询的数据对象进行关联数据获取
$profile = $User->relationGet("Profile");
事实上,除了当前的参考模型User外,其他的关联模型是不需要创建的。
分享到:
评论

相关推荐

    thinkphp关联模型的使用

    关联模型是ThinkPHP中处理数据库关系的重要工具,允许开发者轻松地处理一对一、一对多、多对多的关系。下面将详细介绍这些关联类型及其在实际应用中的使用。 首先,我们来了解一下什么是模型(Model)。在ThinkPHP...

    ThinkPHP关联模型操作实例分析

    ### ThinkPHP关联模型操作实例分析 #### 一、引言 在实际的Web开发中,尤其是在使用MVC架构的框架时,数据模型之间的关联是非常常见且重要的。ThinkPHP框架为处理这种模型间的关联提供了强大的支持。本文将详细介绍...

    ThinkPHP中的关联模型注意点

    在使用ThinkPHP框架进行开发时,关联模型是处理多对多、一对多、一对一等复杂关系的重要工具。关联模型允许开发者方便地操作关联的数据表,提高代码的可读性和维护性。然而,对于初学者来说,理解并正确使用关联模型...

    ThinkPHP5.0数据库和模型

    ThinkPHP5.0的模型还引入了关联关系,比如一对一、一对多、多对多的关系。这些关联可以通过定义`belongsTo()`, `hasMany()`, 和`belongsToMany()`方法实现。关联关系的使用让开发者能够更灵活地处理复杂的数据交互,...

    ThinkPHP5联合(关联)查询、多条件查询与聚合查询实例详解

    ThinkPHP5中可以通过模型的聚合方法来实现,比如查找最大值。例如: ```php "model('admin/Package') ->where("project_id = $Project_version['project_id']") ->where("version_id = $Project_version['version...

    掌握ThinkPHP5.0数据库和模型【官方】.zip

    《掌握ThinkPHP5.0数据库和模型》是针对ThinkPHP框架的一个重要学习资源,特别是对于开发者来说,理解和熟练运用数据库和模型是构建高效、稳定Web应用的关键。ThinkPHP5.0作为国内广泛应用的PHP框架之一,其数据库...

    掌握ThinkPHP5.0数据库和模型(官方-离线版).zip

    《掌握ThinkPHP5.0数据库和模型》是针对开发者深入理解ThinkPHP5.0框架中数据库操作和模型使用的详尽教程。本教程旨在帮助开发者在没有网络环境的情况下也能进行学习和查阅,通过官方的离线版文档,可以更加专注于...

    ThinkPHP中关联查询实例

    了解并熟练掌握这些关联查询技巧,能够帮助你在使用ThinkPHP框架时更加游刃有余,有效提升项目的开发效率和质量。此外,对于其他数据库操作,如模糊查询、视图查询、分页查询等,ThinkPHP也提供了丰富的API和工具,...

    ThinkPHP5sjmx_jb51_数据库模型由浅入深_

    本教程“ThinkPHP5sjmx_jb51_数据库模型由浅入深”专注于讲解如何在ThinkPHP5.0中有效地管理和操作数据库,以及如何利用模型进行数据处理。通过学习,开发者可以深入理解数据库和模型的概念,提高项目开发的效率和...

    掌握ThinkPHP5.0数据库和模型-离线版(官方)_changing81i_控制器_thinkphp5_nan_

    《掌握ThinkPHP5.0数据库和模型-离线版(官方)》是针对ThinkPHP5.0框架的一个详细教程,特别关注数据库管理和模型的运用。本教程旨在帮助开发者从入门到精通,理解并掌握ThinkPHP5.0的核心概念,特别是控制器部分。...

    thinkPhp 资料大全---下载不扣分,回帖加1分,欢迎下载,童叟无欺

    ThinkPHP关联操作.chm ThinkPHP可配置的静态缓存设计.chm ThinkPHP多元化缓存机制.chm ThinkPHP多语言的使用和配置.chm ThinkPHP常见问题集合.chm ThinkPHP快速入门.chm ThinkPHP执行流程(1).chm ThinkPHP...

    thinkphp视图模型查询提示ERR: 1146:Table db.pr_order_view doesnt exist的解决方法

    想用thinkphp的视图模型进行关联查询,结果出现了这样的问题(log日志记录):ERR: 1146:Table ‘db.pr_order_view’ doesn’t exist,我就纳闷,视图模型怎么出来的sql是这样的呢,视图模型如下: 复制代码 代码...

    thinkphp模型

    - `'class_name'`: 关联模型的类名。 #### 六、验证码生成 验证码通常用于防止恶意注册或登录行为。 ```php public function verify() { import('ORG.Util.Image'); Image::buildImageVerify(); } // 显示...

    ThinkPHP视图模型

    视图通常是指数据库的视图,视图是一个虚拟表,其内容...视图在有些数据库下面并不被支持,但是ThinkPHP模拟实现了数据库的视图模型,该功能可以用于多表联合查询。非常适合解决HAS_ONE 和 BELONGS_TO类型的关联查询。

    thinkphp城市三级关联

    在“thinkphp城市三级关联”这个主题中,我们主要讨论的是如何在ThinkPHP框架中实现一个灵活且易于管理的城市分类系统,这种系统通常涉及省、市、区(县)的三级联动。 首先,我们要理解什么是三级关联。在地理划分...

    ThinkPHP5快速入门手册

    在模型和关联章节中,手册详细讲解了模型的定义、基础操作、读取器和修改器、类型转换和自动完成、查询范围、输入和验证以及模型之间的关联等。视图和模板章节则涉及了如何在ThinkPHP中使用模板引擎进行页面渲染。 ...

    ThinkPHP5&5.1框架关联模型分页操作示例

    本知识点将详细分析ThinkPHP5与ThinkPHP5.1框架在处理关联模型时的分页操作,并通过实例向您展示如何实现复杂的关联数据分页。 1. 关联模型的建立 在ThinkPHP5/5.1框架中,关联模型的建立是通过模型(Model)内部的...

    ThinkPHP5快速入门和路由完全指南和数据库模型掌握

    《ThinkPHP5快速入门和路由完全指南》及《数据库模型掌握》是一套全面解析ThinkPHP5框架的教程,旨在帮助初学者迅速上手并深入理解该框架的核心特性。以下是关于这些主题的详细知识点: 1. **ThinkPHP5快速入门**:...

Global site tag (gtag.js) - Google Analytics