看了thinkphp的完全开发手册上的关联模型,其实我看的不太懂,做起来的时候,就有好多错误,比如说xxx表不存在,没有relation方法等等。后来查了好多资料,发现都是代码前头一些命名空间漏了写,或者是表名没写对(所以表名要写好,不然是给自己挖坑。。。)又或者模型的名字没写对。 下面给大家写一下完整的代码,我测试出来是没有问题的哦。仅供参考
这里需要用到三张表(因为是多对多关系,所以还需要一个中间表),比如我有文章表easay,属性表attr,属性就是说这篇文章可以是“置顶”属性,“推荐”属性等等,他们之间是多对多的关系。中间表的属性就是他们两个表的主键id,在这里取名为easay_attr
关联模型名称 EasayModel.class.php
<?php namespace Home\model; use Think\Model; use Think\Model\RelationModel; Class EasayModel extends RelationModel{ protected $_link=array( 'attr'=>array(//这里的attr就是要被连接的表的名称 'mapping_type'=>self::MANY_TO_MANY, //关联模型,记住!'self::MANY_TO_MANY'是错的,不要加引号!!! 'relation_type'=>easay_attr, //这里是中间表,如果有前缀的表,要全部写上。我这个表是没有前缀,所以没写。 'foreign_key'=>'id', //用中间表关联easay表的id,如果不写,那就默认是(表名_id) 'relaton_foreign_key'=>'attr_id', //同理,用中间表关联attr表的id,如果不写,那就默认是(表名_id) ) ); } ?>模型写到这里,就写完了,下面是控制器方法
<?php namespace Home\Controller; use Think\Controller; class indexController extends Controller{ Public function index(){ $model=D('Easay')->relation(true)->select(); /**!!!注意!这里只能用D方法,不能用M方法!并且D方法里面的值要和刚刚起的模型名字要匹配。我写的模型名叫EasayModel.class.php,所以D方法里放的是Easay **/ var_dump($model); } } ?>D方法虽说和M方法虽然都能对数据库进行操作,但是D方法除此之外还有很多用处,比如可以查到同表名的model类,自动验证,自动填充,关联查询。。。 而如果只用到一般的增删改查,就用M方法就可以了。