Php Yii-使用关系中定义的作用域的关系

Php Yii-使用关系中定义的作用域的关系,php,yii,Php,Yii,我有一个模型,其中一些关系定义如下 public function relations() { return array( 'linkingTable' => array(self::HAS_MANY, 'LinkingTable', array('this_id'=>'id'), 'scopes'=>array('valid')), 'linkedItems' => array(self::HAS_MANY, 'LinkedIte

我有一个模型,其中一些关系定义如下

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",
        ),
    );
}
以及:

问题是,当直接从链接模型使用这些范围时,这些范围将不起作用,即:

$linkedItems = LinkedItem::model()->valid()->findAll();
导致错误,说明
linkedItems
不是定义的别名。当然,这是可以理解的。它还导致需要任何其他想要拥有某些LinkedItem的模型,这些模型需要以完全相同的方式定义关系

是为每个用例定义不同范围的唯一解决方案,如下所示:

public function scopes() {
    return array(
        'valid'=>array(
            'condition'=>"t.`valid`=1",
        ),
        'validForModelRelation'=>array(
            'condition'=>"`linkedItems`.`valid`=1",
        )
    );
}

这感觉有点笨拙。我想知道是否有更好的方法来执行此操作?

您需要能够获取表的当前别名
t
当它单独存在时,或者当它是相关模型时,关系名称。在相关模型的范围内,您可以使用:

public function scopes() {
    return array(
        'valid'=>array(
            'condition'=>$this->tableAlias.".`valid`=1",
        ),
    );
}
但是,如果在
defaultScope
中使用它,则需要使用
$this->getTableAlias(false,false)。
作为参数,以防止出现无限循环,尝试查找别名

编辑:点缺失

您需要在 “条件'=>$this->tableAlias.”。
有效
=1“

public function scopes() {
    return array(
        'valid'=>array(
            'condition'=>$this->tableAlias.".`valid`=1",
        ),
    );
}