Yii的 - 使用与关系定义的范围关系(Yii - using relations with sco

2019-07-31 10:45发布

我有一个定义如下一些关系的典范。

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不是一个定义的别名。 这是可以理解的,当然。 这也导致需要谁愿意自己的一些LinkedItems需要来定义完全相同的方式的关系,任何其他模型。

是定义不同的范围为每个用例,这样唯一的解决办法:

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

这感觉有点cludgey。 我想知道是否有这样做的更好的办法?

Answer 1:

你需要能够得到表的当前别名。 t时,它的单独,或当它是一个相关模型的关系名称。 在你可以使用相关模型的范围:

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

如果您在使用它defaultScope但是,你需要使用$this->getTableAlias(false, false). 作为参数,以避免无限循环,试图找到别名。

编辑:点缺失



Answer 2:

你以前'条件'=> $这个- > tableAlias需要一个DOT。 “ valid = 1”,



文章来源: Yii - using relations with scopes defined in the relation
标签: php yii