thinkphp中的关联模型

thinkphp中的关联模型其实就是thinkphp自己实现的数据库关联查询功能,主要是为了方便解决CURD多关联业务操作的, 它和视图模型类似,但不完全一样, 视图模型是通过操作映射字段查询生成虚拟的表结构,关联模型里的结构真实存在。通常说的关联关系有以下几种。

1. 一对一关联 (ONE TO ONE, 包括 HAS_ONE, BELONGS_TO)

我有一件商品, 就是 HAS_ONE, 这件商品属于我, 就是BELONGS_TO

2. 一对多关联 (ONE TO MANY, 包括 HAS_MANY, BELONGS_TO)

很多篇文章是我写的,就是HAS_MANY, 这些文章属于我, 就是BELONGS_TO

3. 多对多关联(MANY TO MANY)

我可以有多个商品, 多个商品又可能会属于其他订单

在thinkphp中, 实现关联模型也是通过模型类实现的, 包含RelationModel, 重写$_link属性就可以了。

比如文章系统, 一个单元可能包括多个分类, 就是HAS_MANY,一个分类下面可能又有不同文章, 也是HAS_MANY, 定义格式是这样的

假使当前是在单元里

protected $_link=array(
   
    'Category'=>array(
       
    'mapping_type'=>self::HAS_MANY,  //定义关联类型 , 一对多的关系, 因为一个单元下面可能会有不同分类。
    'class_name'=>'Category',  //定义关联模型类, 该类其实无需定义, 对应关联数据表名, 只要对应就可以。这里获取的是模型类里定义的信息, 取到的是模型类里定义的关联信息。
    'foreign_key'=>'sectionid', // 定义外键字段, 所属哪个单元
    'mapping_name'=>'categorys', //这里相当于是给当前关联表取的一个别名, 是用来获取数据的, 这里是映射的当前关联表, 取到的是表里的信息。
    'mapping_order'=>'sectionid desc', //这里是关联查询排序, 升序还是降序。

    ),
    'Artcle'=>array(
       
    'mapping_type'=>self::HAS_MANY,
    'class_name'=>'Artcle',
    'foreign_key'=>'sectionid',
    'mapping_name'=>'artcles',
    ),

定义好单元关联模型后, 就可以去单元控制下, 通过

       $list = $sec->relation(true)->select();

查出单元下的分类下的文章, 很是方便。

如果是定义分类关联模型, 首先考虑的就是分类属于哪个单元? 这里关联类型就是BELONGS_TO, 关联模型类就是单元表名, 外键就是所属单元id, 然后给一个别名就可以了。

查询时要把relation设置为true是因为默认是普通查询, 开启后才会变成关联查询。

此条目发表在thinkphp分类目录,贴了, , , 标签。将固定链接加入收藏夹。