我有一个非常简单的关系定义如下(aId
和bId
是每个表的主键)。
class A extends CActiveRecord
{
// @var int32 $aId
}
class B extends CActiveRecord
{
// @var int32 $bId
// @var int32 $aId
public function relations()
{
return array(
'a'=>array(self::HAS_ONE, 'A', 'aId'),
);
}
}
只要bId <= 5
,我就可以通过$bModel->a
访问A,而不会有任何问题。奇怪的是,对于bId > 5
,$bModel->a
为空。我已经检查了$bModel->aId
和bId > 5
,并且外键是正确的。我甚至可以用$aModel = A::model()->findByPk($bModel->aId);
访问A。我还可以在数据库表中手动编辑我的bId
,这会产生相同的结果。
我不知道是什么导致主键大于5的关系失败。有什么故障排除建议吗?我不知所措。
已编辑
事实证明我没有正确使用这个关系。我应该用BELONGS_TO。
class B extends CActiveRecord
{
// @var int32 $bId
// @var int32 $aId
public function relations()
{
return array(
'a'=>array(self::HAS_ONE, 'A', 'aId'),
);
}
}
HAS_ONE导致B使用bId
索引A。由于我的数据库中有五个A实例可用于bID < 5
在应用程序配置中启用查询日志记录,以查看到底发生了什么。手动运行这些查询时,是否得到任何结果?
"components"=>数组("db"=>数组((..)'enableParamLogging'=>true,),'log'=>数组('class'=>'CLogRouter',"routes"=>数组(//在网页上显示日志消息阵列('class'=>'CWebLogRoute',"categories"=>"system.db.CDb命令",//查询'levels'=>'error,warning,trace,info',//'showInFireBug'=>true,),
(我想把它作为评论而不是答案发布,但似乎我不能)
我建议你使用这个->Yii调试工具栏(它是我在乌克兰的朋友创建的)。
你能提供mysql结构+一些示例数据吗。谢谢