关联模型[1]

一. 模型简介
关联模型,一共有三种模式。一对一:ONE_TO_ONE,包括 HAS_ONE 和 BELONGS_TO;
一对多:ONE_TO_MANY,包括 HAS_MANY 和 BELONGS_TO;多对多:MANY_TO_MANY。
          用表关系来理解这三种模式:
一对一:用户表和身份证表,一个用户只能对应一个身份证,而一个身份证只能对应一
          个用户。这就是一对一。
一对多:用户表和留言表:一个用户可以发表 N 条留言,而每条留言只能由某一个用户
          发表。这就是一对多。就算有多个用户发表了相同的留言内容,但 ID 却不一样,所以,不
          能理解为多对多。
多对多:用户表和角色表:一个用户可以是认证专员,同时也是审核专员。那么角色表
          中的审核专员也可以是蜡笔小新的角色,也可以是路飞的角色。这就是多对多。

二. 关联操作

用户表和身份证表关联,HAS_ONE(一对一),表示一个用户只有一个身份证。

先创建两个数据表:

think_card

think_user

WeiBo/Home/Controller/UserController.class.php 中插入代码:

 1 <?php
 2
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 use Home\Model\UserModel;
 6
 7 class UserController extends Controller {
 8     public function index() {
 9         $user = D(‘User‘);
10         $arr = $user->relation(true)->select();
11         var_dump($arr);
12     }
13  }

然后在 WeiBo/Home/User/Model/UserModel.class.php 中插入代码:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 use Think\Model\RelationModel;
 5
 6 class UserModel extends RelationModel {
 7     protected $_link = array(
 8         ‘Card‘=>array(
 9             ‘mapping_type‘=>self::HAS_ONE,
10             ‘class_name‘=>‘Card‘,
11             ‘mapping_name‘=>‘Card‘,
12             ‘foreign_key‘ =>‘uid‘,
13             ‘mapping_fields‘=>‘code‘,
14             ‘as_fields‘=>‘code‘,
15             ‘condition‘=>‘id=1‘,
16             ),
17         );
18 }

HAS_ONE 支持以下属性

class_name  关联的模型类名,如果不写,会自动定位相关数据表。
mapping_name 关联映射名称,用于获取数据的数组名。
mapping_type 设置关联模式,比如一对一 self::HAS_ONE。
foreign_key  关联外键的名称,会自动对应当前数据表的 id。
mapping_fields  关联要查询的字段,默认是查询所有。
as_fields  关联的字段映射成同级的字段。
condition 关联条件,额外查询使用。

在 WeiBo/Home/User/Model/UserModel.class.php 中测试各行代码的效果:

1 protected $_link = array(
2         ‘Card‘=>array(
3             ‘mapping_type‘=>self::HAS_ONE,
4             ‘class_name‘=>‘Card‘,
5             ‘mapping_name‘=>‘Carder‘,
6             ),
7         );    

效果为:

‘class_name‘=>‘Card‘, 这行可以不写,因为不写的的时候默认会自动定位相关数据表,

但写了就不能写错了,必须和数据表的名字是一样的。

‘mapping_name‘=>‘Carder‘, 则这时把定位的数据表的名字改为 Carder ,这时什么都没显示,

是因为没有设置关联的外键,加上 ‘foreign_key‘ =>‘uid‘, 后,得到效果如图:

这时就可以得到think_card和think_user的数据表关联在一起了。

加上 ‘mapping_fields‘=>‘code‘, 后,只获取think_card中的code数据;

再加上 ‘as_fields‘=>‘code‘, 后,则将think_card中的code数据呈现形式和think_user中的数据呈现形式一样:

加上 ‘condition‘=>‘id=1‘, 后,获取 think_card 中只获取 id=1 的数据,只是SQL查询的方式有些变化

没加之前是:

加了之后:

这时读取数据中只有id=1的数据中有code,其它的code的数据都是NULL,

下面是BELONGS_TO关联模型:

Belongs_to 关联表示当前模型从属于另外一个父对象,例如每个用户都属于一个部门

新建 WeiBo/Home/Controller/CardController.class.php ,代码为:

 1 <?php
 2 namespace Home\COntroller;
 3 use Think\Controller;
 4
 5 class CardController extends Controller {
 6     public function index() {
 7         $card = D(‘Card‘);
 8         $arr=$card->relation(true)->select();
 9         var_dump($arr);
10     }
11 }

新建 WeiBo/Home/User/Model/CardModel.class.php ,插入代码:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 use Think\Model\RelationModel;
 5
 6 class CardModel extends RelationModel {
 7     protected $_link = array(
 8       ‘User‘=>array(
 9          ‘mapping_type‘=>self::BELONGS_TO,
10          ‘foreign_key‘=>‘uid‘,
11          ‘mapping_fields‘=>‘user‘,
12          ‘as_fields‘=>‘user‘,
13           ),
14     );
15
16 }

‘foreign_key‘=>‘uid‘, 中关联的uid是card表中的结构,而不是user表中的结构。card中的uid的数据为:1,2,4,则得到的结果是:

红色标出的是需要注意的部分,如果这里写id,在card表中的数据为1,2,3则出现的结果为:

此时得到的数据是user里面的第3个用户的名字。

时间: 2024-10-10 10:32:08

关联模型[1]的相关文章

thinkphp 关联模型配置代码

<?php /** * 公司与部门关联模型 */ class CompanyRelationModel extends RelationModel{ //主表名称 protected $tableName = 'company'; //定义关联关系 protected $_link = array( //关联表名称 'department' => array( 'mapping_type' => MANY_TO_MANY, //多对多关系 'foreign_key' => 'com

thinkphp关联模型的用法

HAS_ONE(值得注意的是,这是主动关联,外键必须是被关联的表): 1 <?php 2 namespace Home\Model; 3 use Think\Model\RelationModel; 4 class TagModel extends RelationModel{ 5 protected $_link =array( 6 'artag'=>array(//关联的数据表 7 'mapping_type'=>self::HAS_ONE,//一对一 8 'class_name'

ThinkPHP 3.2.3 关联模型的使用

关于关联模型 ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取.关联写入.关联删除等. 实例 博客管理模块关于博客有 4 张数据表:博客表 crm_blog: CREATE TABLE `crm_blog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL DEFAULT '', `content` text NOT NULL, `tim

ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为,一条评论 id 对应一篇文章,为 ONE_TO_ONE 关系 ( 一对一 ).评论表的结构为: 其中 aid 字段与文章表的 id 字段对应.打开自定义模型 ArticleModel,让模型继承于 RelationModel,然后定义成员属性 $_link,代码: ArticleModel.cla

【ThinkPHP】关于ThinkPHP关联模型和视图模型的一些心得

视图模型更加类似一张表虚拟的表,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.对其中所引用的基础表来说,视图的作用类似于筛选,这是ThinkPHP手册上的说法 其实说白了,视图模型就是mysql多表查询而已,视图模型不支持多表更新,删除 而关联模型是多个表查询以后的结果组合,会多次查询mysql,(在执行完主表查询以后,会有个_after_select)之类的操作,然后组合结果集.在一些情

ThinkPHP 关联模型(二十)

原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和  user  关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表自定义的Mode  --->Home\Lib\Model\MessageModel.class.php <?php class MessageModel extends RelationModel{ //这是自动填充 protected $_auto=array( array('time','ti

thinkphp 多对多关联模型(转)

先建立一个模型 1 2 3 4 5 6 7 8 9 10 11 12 <?php  class UserModel extends RelationModel{      protected $_link=array(        "group"=>array(            "mapping_type"=>MANY_TO_MANY,            "foreign_key"=>"uid&quo

thinkphp 3.2中依靠关联模型来关联三个表

这里说的是用thinkphp3.2关联模型关联三个表 根据用户表查询出三个表的数据,需要两个model来配合,第一个model是根据user表来查询到班级的信息,然后第二个model是根绝banji中的信息去查询年级中的信息 还有一个模型也可以做到这种效果,就是视图模型

ThinkPHP 关联模型中查询某条记录的父级(非查询子级)

数据表 id      cat_name      cat_pid 76     手机.数码     0 84     手机配件        76 86     蓝牙耳机        84 从属关系 : 蓝牙耳机  =>(上一级)  手机配件   =>(上一级)  手机.数码(顶级了) 关联模型 namespace Admin\Model; use Think\Model\RelationModel; class CategoryModel extends RelationModel {