4

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

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

这感觉有点笨拙。我想知道是否有更好的方法来做到这一点?

4

2 回答 2

6

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

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

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

编辑:点丢失

于 2012-09-07T09:15:58.027 回答
0

在 'condition'=>$this->tableAlias.". valid=1",

于 2013-06-07T09:35:50.320 回答