我有一个模型,其中一些关系定义如下.
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')),
);
}
Run Code Online (Sandbox Code Playgroud)
链接表和链接项都具有有效范围:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
);
}
Run Code Online (Sandbox Code Playgroud)
为了使生成的连接查询能够与关系范围一起使用,我必须修改范围,如下所示:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkingTable`.`valid`=1",
),
);
}
Run Code Online (Sandbox Code Playgroud)
和:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkedItems`.`valid`=1",
),
);
}
Run Code Online (Sandbox Code Playgroud)
问题是当直接从链接模型使用时,这些范围将不起作用,即:
$linkedItems = LinkedItem::model()->valid()->findAll();
Run Code Online (Sandbox Code Playgroud)
导致错误表示linkedItems不是已定义的别名.当然,这是可以理解的.它还导致需要任何其他想要拥有某些LinkedItem的模型,这些LinkedItem需要以完全相同的方式定义关系.
是为每个用例定义不同范围的唯一解决方案,如下所示:
public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
'validForModelRelation'=>array(
'condition'=>"`linkedItems`.`valid`=1",
)
);
}
Run Code Online (Sandbox Code Playgroud)
这感觉有点笨拙.我想知道是否有更好的方法这样做?
您需要能够获取表的当前别名.t什么时候单独使用,或者当它是相关模型时的关系名称.在相关模型的范围内,您可以使用:
public function scopes() {
return array(
'valid'=>array(
'condition'=>$this->tableAlias.".`valid`=1",
),
);
}
Run Code Online (Sandbox Code Playgroud)
defaultScope但是,如果您在其中使用它,则需要使用$this->getTableAlias(false, false).参数来防止无限循环,尝试查找别名.
编辑:缺少点