2012-09-07 87 views
4

我有一個模型,其關係定義如下。Yii - 使用與關係中定義的範圍的關係

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。我想知道是否有更好的方法來做到這一點?

回答

6

您需要能夠獲取表格的當前別名。當它是單獨的時候,或者它是相關模型時的關係名稱。在相關模型的範圍,你可以使用:

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

如果您在defaultScope使用它,你就需要使用$this->getTableAlias(false, false).作爲參數,以避免無限循環,試圖找到別名。

編輯:DOT缺少

+0

'getTableAlias()'工作一種享受,謝謝。 「valid = 1。」! – bcmcfc

0

你之前 '條件' 需要一個DOT => $這個 - > tableAlias,