我有一个定义如下一些关系的典范。
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。 我想知道是否有这样做的更好的办法?