4

UserBanモデルで次の関係が定義されています。

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');

User 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))

どうすればこれを乗り越えられますか? 結合されたテーブルの「エイリアス」はどこにしますか?

編集 User モデルのデフォルトのスコープは次のとおりです。

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

1 に答える 1

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,
    );
}
于 2013-05-20T10:27:47.620 に答える