精华内容
下载资源
问答
  • 一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。关联定义的格式是: protected $_link = array
    ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:HAS_ONE、BELONGS_TO、HAS_MANY、MANY_TO_MANY。
    
    一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。关联定义的格式是:
    protected $_link = array(


        '关联1'  =>  array(


            '关联属性1' => '定义',


            '关联属性N' => '定义',


        ),


        '关联2'  =>  array(


            '关联属性1' => '定义',


            '关联属性N' => '定义',


        ),


        ...


    );
    下面我们首先来分析下各个关联方式的定义:
    HAS_ONE
    HAS_ONE关联表示当前模型拥有一个子对象,例如,每个员工都有一个人事档案。我们可以建立一个用户模型UserModel,并且添加如下关联定义: PHP代码
    class UserModel extends RelationModel    


    {    


     public $_link = array(    


           'Profile'=> HAS_ONE,    


    );    


    }   
    上面是最简单的方式,表示其遵循了系统内置的数据库规范,完整的定义方式是:
    PHP代码
    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 完整方式定义为:
    PHP代码
    '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 关联表示当前模型拥有多个子对象,例如每个用户有多篇文章,我们可以这样来定义:
    PHP代码
    'Article'=> HAS_MANY   
    完整定义方式为:
    PHP代码
    '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. 完整定义方式为:
    PHP代码
    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属性。
    展开全文
  • --嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则 --> <resultMap type="com.atguigu.mybatis.bean.Department" id="MyDept"> <id column="did" property="id"/> ...

    DepartmentMapper.java

    package com.atguigu.mybatis.dao;
    
    import com.atguigu.mybatis.bean.Department;
    
    public interface DepartmentMapper {
    	
    	public Department getDeptById(Integer id);
    	
    	public Department getDeptByIdPlus(Integer id);
    
    	public Department getDeptByIdStep(Integer id);
    }
    

    department.java

    package com.atguigu.mybatis.bean;
    
    import java.util.List;
    
    public class Department {
    	
    	private Integer id;
    	private String departmentName;
    	private List<Employee> emps;
    	
    	
    	
    	public List<Employee> getEmps() {
    		return emps;
    	}
    	public void setEmps(List<Employee> emps) {
    		this.emps = emps;
    	}
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getDepartmentName() {
    		return departmentName;
    	}
    	public void setDepartmentName(String departmentName) {
    		this.departmentName = departmentName;
    	}
    	@Override
    	public String toString() {
    		return "Department [id=" + id + ", departmentName=" + departmentName
    				+ "]";
    	}
    	
    	
    
    }
    
    

    DepartmentMapper.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.atguigu.mybatis.dao.DepartmentMapper">
    	<!--public Department getDeptById(Integer id);  -->
    	<select id="getDeptById" resultType="com.atguigu.mybatis.bean.Department">
    		select id,dept_name departmentName from tbl_dept where id=#{id}
    	</select>
    	
    	
    	
    	<!-- 
    	public class Department {
    			private Integer id;
    			private String departmentName;
    			private List<Employee> emps;
    	  did  dept_name  ||  eid  last_name  email   gender  
    	 -->
    	 
    	<!--嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则  -->
    	<resultMap type="com.atguigu.mybatis.bean.Department" id="MyDept">
    		<id column="did" property="id"/>
    		<result column="dept_name" property="departmentName"/>
    		<!-- 
    			collection定义关联集合类型的属性的封装规则 
    			ofType:指定集合里面元素的类型
    		-->
    		<collection property="emps" ofType="com.atguigu.mybatis.bean.Employee">
    			<!-- 定义这个集合中元素的封装规则 -->
    			<id column="eid" property="id"/>
    			<result column="last_name" property="lastName"/>
    			<result column="email" property="email"/>
    			<result column="gender" property="gender"/>
    		</collection>
    	</resultMap>
    	<!-- public Department getDeptByIdPlus(Integer id); -->
    	<select id="getDeptByIdPlus" resultMap="MyDept">
    		SELECT d.id did,d.dept_name dept_name,
    				e.id eid,e.last_name last_name,e.email email,e.gender gender
    		FROM tbl_dept d
    		LEFT JOIN tbl_employee e
    		ON d.id=e.d_id
    		WHERE d.id=#{id}
    	</select>
    	
    	<!-- collection:分段查询 -->
    	<resultMap type="com.atguigu.mybatis.bean.Department" id="MyDeptStep">
    		<id column="id" property="id"/>
    		<id column="dept_name" property="departmentName"/>
    		<collection property="emps" 
    			select="com.atguigu.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
    			column="{deptId=id}" fetchType="lazy"></collection>
    	</resultMap>
    	<!-- public Department getDeptByIdStep(Integer id); -->
    	<select id="getDeptByIdStep" resultMap="MyDeptStep">
    		select id,dept_name from tbl_dept where id=#{id}
    	</select>
    	
    	<!-- 扩展:多列的值传递过去:
    			将多列的值封装map传递;
    			column="{key1=column1,key2=column2}"
    		fetchType="lazy":表示使用延迟加载;
    				- lazy:延迟
    				- eager:立即
    	 -->
    </mapper>
    
    展开全文
  • 关联规则 置信度定义

    2016-11-07 17:39:43
    关联规则中相关定义在附件中有定义  
    关联规则中相关定义在附件中有定义

     

    展开全文
  • laravel的官方文档上面只介绍了belongsToMany的4个参数,文档如下: 到这里为止,官方文档上面对于多对多关联介绍差不多完了,如果想查看更多请看官方文档。下面我来介绍在我们遇到两个表进行多对多关联,而且关联...

    laravel的官方文档上面只介绍了belongsToMany的4个参数,文档如下:




     到这里为止,官方文档上面对于多对多关联介绍差不多完了,如果想查看更多请看官方文档

    下面我来介绍在我们遇到两个表进行多对多关联,而且关联的时候,设置这两个表与中间表的关联字段。

    例如:

        a表结构为:

            id 主键,

            tag 标识,

            …………

        b表结构为:

            id 主键,

            …………

        a_b表结构为:

            id 主键,

            b_id,

            a_tag

      当我们遇到这种情况的时候,查看官方文档上并没有找到相关的处理方法,官方文档上面的介绍整体说下来 :

        belongsToMany(关联表模型,中间表表名,中间表与当前模型的关联字段,中间表与关联表的关联字段);

        如果我们上面的表结构按照这种方式关联,假设我们当前模型为a ;  那么关联写为 belongsToMany(b:class, 'a_b', 'a_tag', 'b_id');

     如果我们这么写的话,产生出来的sql为:

        select * from b inner join a_b on b.id = a_b.id where a_b.a_tag = a.id;

    这样问题就出现了,我们实际上想要的sql语句为:

        select * from b inner join a_b on b.id = a_b.id where a_b.a_tag = a.tag;

    但是,我们应该怎么做才可以得到这样的结果呢?

        那就需要看下关于belongsToMany()的第四、第五个参数了;

        我先贴上laravel源码:

    public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
                                      $parentKey = null, $relatedKey = null, $relation = null)
        {
            // If no relationship name was passed, we will pull backtraces to get the
            // name of the calling function. We will use that function name as the
            // title of this relation since that is a great convention to apply.
            if (is_null($relation)) {
                $relation = $this->guessBelongsToManyRelation();
            }
    
            // First, we'll need to determine the foreign key and "other key" for the
            // relationship. Once we have determined the keys we'll make the query
            // instances as well as the relationship instances we need for this.
            $instance = $this->newRelatedInstance($related);
    
            $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey();
    
            $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey();
    
            // If no table name was provided, we can guess it by concatenating the two
            // models using underscores in alphabetical order. The two model names
            // are transformed to snake case from their default CamelCase also.
            if (is_null($table)) {
                $table = $this->joiningTable($related);
            }
    
            return $this->newBelongsToMany(
                $instance->newQuery(), $this, $table, $foreignPivotKey,
                $relatedPivotKey, $parentKey ?: $this->getKeyName(),
                $relatedKey ?: $instance->getKeyName(), $relation
            );
    上面是源码,我们主要看
    
    
    return $this->newBelongsToMany(
                $instance->newQuery(), $this, $table, $foreignPivotKey,
                $relatedPivotKey, $parentKey ?: $this->getKeyName(),
                $relatedKey ?: $instance->getKeyName(), $relation
            );

    我们看了上面的代码后明确知道了,belongsToMany()有7个参数,我们通过官方文档已经知道了前四个参数的作用,剩下两个参数只能我们自己通过源码来研究

    $instance->newQuery(),$this, $table, $foreignPivotKey

    返回值中的这几个参数我就不多做描述了,我主要描述:

    $relatedPivotKey, $parentKey ?: $this->getKeyName(),
                $relatedKey ?: $instance->getKeyName()

    这两个,也就是belongsToMany的第5、6个参数

    第五个参数,我看了他的主要功能为判断是否传入该参数如果没有传入这个参数就去调用getKeyName(); 有的人要问了getKeyName()是干什么的呢?我也想问,然后我就继续查看了geiKeyName()的源码。这个方法是Model类的一个方法,用来获取表主键的.这仅仅说了getKeyName()方法,不是还有个$this没有说它到底指向的谁?它指向的是当前调用belongsToMany()的模型。

    第六个参数与第五个参数作用是一样的,只是获取的模型不同而已。这个参数获取的是关联表的主键.


    参数讲完了,我们传入后会得到什么样的sql呢?

    belongsToMany(b:class,  'a_b',  'a_tag',  'b_id', 'tag', 'id');

    下面我们就来看看到底会得到怎样的sql:

        select * from b inner join a_b on b.id = a_b.id where a_b.a_tag = a.tag ; 这就是我们得到的sql;

    仔细看看,是不是和我们上面想要得到的sql语句一样?


    展开全文
  • Thinkphp5关联模型的定义与使用

    万次阅读 2017-12-29 00:30:22
    定义一对一关联这里假设你已经把thinkphp5的环境都配置好了,数据库也连接OK了。想通过模型把两张表关联起来然后在通过控制器一调用就可以得到两张表的信息。 现在我准备了两张表,一张管理员表pwn_admin一张管理员...
  • orm2 中文文档 4. 定义关联

    万次阅读 2016-01-10 12:12:28
    译者:飞龙 ...关联是一个或多个[模型之间](3. Defining Models.md)的关系。关联的类型: [hasOne(一对多)](4.1 hasOne.md) [hasMany(多对多)](4.2 hasMany.md) [extendsTo(一对一)](4.3 extendsTo.md)
  • 挖掘频繁模式、关联和相关性频繁模式包括:频繁项集、频繁子序列、频繁子结构。频繁项集:频繁的在事物数据集中一起出现的商品的集合。频繁子序列:如先购买相机,在购买三脚架,在购买闪光灯这样的一个频繁的模式...
  • ansys 定义变量(关联模型)

    千次阅读 2018-06-06 14:25:33
    还有就是在分析中用到的参数变量,比如载荷中的力、面压,速度、位移等,在ANSYS workbench中定义前一种变量,可以在ANSYS本身的模型前处理里面进行定义,也可以在 三维建模 软件里面进行定义,只需要在想要定义的...
  • 今天使用SI发现有BUG?还是就是没办法显示关联 ...但如果直接把GPIOB定义为全局变量,类型为结构体指针就可以关联,如图: 但是我发现KEIL5中这种通过宏定义的结构体,还是能关联到成员。如图: 小白求助 ...
  • 简介 map是<键—值>对的集合 如:map,int> word_count。map类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。... 在定义map 对象时,必须分别指明键和值的类型: 记住!
  • 这样定义的宏,在SourceInsight里面不能关联显示,求大侠帮忙解决这个问题哦,谢谢!
  • LoadRunner 关联和集合、检查

    千次阅读 2017-07-21 15:55:26
    1)关联定义 很多时候,当时录完之后,没有问题。过一段时间再跑脚本,就不会成功。比如session,过期了,再一次使用,就会出错。这个时候,需要在每次访问的时候动态的拿到session,这种情况就需要用到关联。 ...
  • Thinkphp5关联模型多对多的定义与使用

    万次阅读 多人点赞 2018-01-01 19:04:11
    想了想我还是觉得在写一篇关于多对多的文档吧,因为我看了官方的文档写...大家都知道数据库多对多关系都是需要三张表来完成的,一张主表,一张关联表,还有一张中间表。比如我们这里主表是学生表关联课程表。因为一个学
  • 关联类型

    千次阅读 2016-12-07 23:11:29
    定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 948,166
精华内容 379,266
关键字:

关联点的定义