【发布时间】:2012-08-11 18:37:35
【问题描述】:
我找不到太多关于在 yii 中将默认范围应用于模型的文档,我想知道是否有人可以解释或指出正确的方向。
我的问题的快速版本:
是否可以将关系添加到默认范围,或者默认为模型上的每个 AR 搜索添加“with”条件?
我的问题的长版本:
我的应用程序的简要总结:
我有两个模型,provider 和 item。它具有 m: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'),
);
}
...
}
在我的项目模型中,我已经有一个 defaultScope 过滤掉所有离线项目(即只显示设置为 offline = false 的项目):
public function defaultScope()
{
$alias = $this->getTableAlias(false,false);
return array(
'condition'=>"`$alias`.`offline` = false",
);
}
我现在想要做的,也是过滤掉他们的提供者设置为离线的项目(即只显示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",
);
}
但是 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",
);
}
但我得到同样的错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'provider.offline' in 'on clause'`)。
有什么建议吗?
【问题讨论】:
标签: yii relation scopes default-scope