应用默认范围并引用yii中的关系

Stu*_*Stu 5 relation yii default-scope scopes

我找不到太多关于在yii中将默认范围应用于模型的文档,我想知道是否有人可以解释或指出我正确的方向.

我的问题的快速版本:

是否可以向默认范围添加关系,或者默认情况下为模型上的每个AR搜索添加"with"条件?

我的问题的长版本:

我的应用程序的快速摘要:

我有两个型号,provideritem.它有:1关系,其中提供者可以有许多项目,但每个项目只能有一个提供者.

到目前为止,我有这些关系:

class Provider extends CActiveRecord
{
    ...
    public function relations()
    {
        return array(
            'items' => array(self::HAS_MANY, 'Item', 'id_provider', 'order'=>'rank DESC'),
        );
    }
    ...
}

class Item extends CActiveRecord
{
    ...
    public function relations()
    {
        return array(
            'provider' => array(self::BELONGS_TO, 'Provider', 'id_provider'),
        );
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的项目模型中,我已经有了一个defaultScope来过滤掉所有离线项目(即只显示设置为的项目offline = false):

public function defaultScope()
{
    $alias = $this->getTableAlias(false,false);
    return array(
        'condition'=>"`$alias`.`offline` = false",
    );
}
Run Code Online (Sandbox Code Playgroud)

我现在要做的是,还过滤掉其提供者设置为离线的项目(即仅显示provider.offline = false当前项目旁边的项目item.offline = false).

我尝试在defaultScope中加入providers表:

public function defaultScope()
{
    $alias = $this->getTableAlias(false,false);
    return array(
        'join'=>"JOIN `provider` AS `provider` ON `provider`.`id` = `$alias`.`id_provider`",
        'condition'=>"`$alias`.`offline` = false AND `provider`.`offline` = false",
    );
}
Run Code Online (Sandbox Code Playgroud)

但是JOIN在ON语句之后应用,并导致错误(CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'provider.offline' in 'on clause').

我还尝试在defaultScope中添加with条件:

public function defaultScope()
{
    $alias = $this->getTableAlias(false,false);
    return array(
        'with'=>"provider",
        'condition'=>"`$alias`.`offline` = false AND `provider`.`offline` = false",
    );
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了同样的错误:SQLSTATE [42S22]:未找到列:1054'on clause'中的未知列'provider.offline').

有什么建议?

小智 6

我会尝试一些事情:

首先,改变你的条件以适用于整个事情(并且不要忘记,如果没有提供者的项目,它将不会返回提供者)

public function defaultScope()
{
    return array(
        'with'=> array("provider" => array(
            'condition'=> "t.offline = false AND provider.offline = false",
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

其次,尝试将范围添加到模型中,然后在默认范围内引用它们,如下所示:

public function defaultScope()
{
    return array(
        'scopes'=> array('default'),
    );
}

class Provider extends CActiveRecord
{
    ...
    public function scopes()
    {
        ...
    }
    ...
}

class Item extends CActiveRecord
{
    ...
    public function scopes()
    {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)