2013-05-20 73 views
4

我在UserBan模型定義了以下關係:Yii的倍數關係到同桌

public function relations() 
{ 
    // NOTE: you may need to adjust the relation name and the related 
    // class name for the relations automatically generated below. 
    return array(
     'user' => array(self::BELONGS_TO, 'User', 'userId'), 
     'target' => array(self::BELONGS_TO, 'User', 'targetId'), 
     'author' => array(self::BELONGS_TO, 'User', 'authorId'), 
    ); 
} 

現在,當我嘗試這樣做:

$criteria->with = array('user', 'target'); 

它尖叫以下,因爲用戶mdel與暱稱具有默認範圍關係:

Not unique table/alias: 'nicknames' 

SQL:

SELECT COUNT(DISTINCT `t`.`id`) FROM `userban` `t` 
LEFT OUTER JOIN `user` `user` ON (`t`.`userId`=`user`.`id`) 
LEFT OUTER JOIN `nickname` `nicknames` ON (`nicknames`.`userId`=`user`.`id`) 
LEFT OUTER JOIN `user` `target` ON (`t`.`targetId`=`target`.`id`) 
LEFT OUTER JOIN `nickname` `nicknames` ON (`nicknames`.`userId`=`target`.`id`) 
WHERE ((user.name LIKE :username) AND (:dateStart<=t.createdAt AND :dateEnd>=t.createdAt)) 

我該如何克服?我在哪裏「別名」我的連接表?

編輯 下面是用戶模型的默認範圍:

public function defaultScope() 
    { 
     return array(
      'with' => 'nicknames', 
      'together' => true 
     ); 
    } 
+0

作爲一個提示,也爲需要 –

回答

8

當你定義多個關係到同一個表是爲每一個指定唯一的別名是一個好主意。你這樣做,指定的關係時:

return array(
    'user' => array(self::BELONGS_TO, 'User', 'userId', 'alias' => 'unick'), 
    'target' => array(self::BELONGS_TO, 'User', 'targetId', 'alias' => 'tnick'), 
    'author' => array(self::BELONGS_TO, 'User', 'authorId', 'alias' => 'anick'), 
); 

有關更多信息,請參閱CActiveRecord::relations的文檔。

更新:看來你還需要使用不同的別名來加入默認範圍內的nicknames表。我不知道什麼是最好的方式做到這一點會是這樣,但這個工程,它很容易做到:

public function defaultScope() 
{ 
    static $counter = 0; 

    return array(
     'with' => array(
      'nicknames' => array('alias' => 'nick'.($counter++)) 
     ), 
     'together' => true, 
    ); 
} 
+0

酷,不知道你每個鍵創建索引可以在關係數組中定義別名。 –

+0

我不認爲我會得到什麼解決。該查詢仍然存在相同的問題:https://gist.github.com/samsonradu/5611950 – Samson

+0

這不是導致此問題的多重關係本身。它是多重關係的默認範圍,無論我怎麼稱呼它,對於每個用戶模型都是相同的。 - 糾正我,如果我在這裏錯了:) – Samson