public function relations()
{
return array(
'linkingTable' => array(self::HAS_MANY, 'LinkingTable', array('this_id'=>'id'), 'scopes'=>array('valid')),
'linkedItems' => array(self::HAS_MANY, 'LinkedItem', array('linked_item_id'=>'id'), 'through'=>'linkingTable', 'scopes'=>array('valid')),
);
}
public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
);
}
为了使生成的连接查询能够与关系范围一起使用,我必须修改范围,如下所示:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkingTable`.`valid`=1",
),
);
}
和:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkedItems`.`valid`=1",
),
);
}
问题是当直接从链接模型使用时,这些范围将不起作用,即:
$linkedItems = LinkedItem::model()->valid()->findAll();
导致一个错误,即linkedItems不是定义的别名.当然,这是可以理解的.它还导致需要任何其他想要拥有某些需要以完全相同的方式定义关系的LinkedItem的模型.
是为每个用例定义不同范围的唯一解决方案,如下所示:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
'validForModelRelation'=>array(
'condition'=>"`linkedItems`.`valid`=1",
)
);
}
这感觉有点笨拙.我想知道是否有更好的方法这样做?
解决方法:
您需要能够获取表的当前别名.当它是单独的时候,或当它是相关模型时的关系名称.在相关模型的范围内,您可以使用:
public function scopes() {
return array(
'valid'=>array(
'condition'=>$this->tableAlias.".`valid`=1",
),
);
}
但是,如果您在defaultScope中使用它,则需要使用$this-> getTableAlias(false,false).作为防止无限循环的参数,试图找到别名.
编辑:缺少点
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。