Thinkphp2.0中关联模型中的一个bug

今天天气真好啊。。
在最近一个新项目的开发中,我采用了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);

问题成功解决了。

2 Responses to “Thinkphp2.0中关联模型中的一个bug”


Leave a Reply