今天天气真好啊。。
在最近一个新项目的开发中,我采用了thinkphp作为开发框架,需求是围绕discuz和uchome进行的二次开发。
我在Conf/config.php配置文件中设置的默认表前缀是”a_”,但由于需求需要,我需要从论坛的”cdb_activitities” 和”cdb_threads”两张表中进行关联查询。按照tp开发手册上所说,我自定义了一下两张表模型的表前缀,并加上关联规则:
/** * Activities模型 * * @author xhowhy */ class ActivitiesModel extends RelationModel { //put your code here protected $tablePrefix = 'cdb_'; public $_link = array( 'threads'=>array( 'mapping_type'=>HAS_ONE, 'class_name' =>'threads', 'foreign_key'=>'tid' ) ); } /** * Description of ThreadsModelclass * * @author Administrator */ class ThreadsModel extends RelationModel { //put your code here protected $tablePrefix = 'cdb_'; }
可关联后进行查询,发现class_name返回的是bool(false)。我很奇怪,就算是没有被关联的数据,那返回的也应该是null,怎么会是bool(false)。后来经过查看tp源码中的Thinkphp/Lib/Think/Core/Model/RelationModel.class.php文件,终于在170行找到原因:
// 获取关联模型对象 $model = M($mappingClass);
可以看出,在生成关联模型对象的时候,源码中采用了M函数,而在Thinkphp/common/function.php中定义的M函数的作用是“M函数用于实例化一个没有模型文件的Model”。很显然,根据上下文,这里应该使用D函数。因为就算是关联模型,也不一定没有模型文件,同样有可能是自定义表前缀、甚至是跨库操作。
所以代码应该改成:
// 获取关联模型对象 $model = D($mappingClass);
问题成功解决了。