2015-01-31 72 views
3

在 “门票” 的模式:Yii2不是唯一的表/别名: '用户'

public function getUser() 
{ 
    return $this->hasOne(User::className(), ['id' => 'user_id']); 
} 


public function getSupervisor() 
{ 
    return $this->hasOne(User::className(), ['id' => 'supervisor_id']); 

在 “TicketSearch” 模式:

$query->joinWith(['user','supervisor']); 

    $query 
     ->andFilterWhere(['like', 'user.surname', $this->user_id]) 
     ->andFilterWhere(['like', 'user.surname', $this->supervisor_id] 

如果我尝试搜索主管,得到这个错误:

Not unique table/alias: 'user' 
The SQL being executed was: SELECT COUNT(*) FROM `ticket` LEFT JOIN `user` ON `ticket`.`user_id` = `user`.`id` LEFT JOIN `user` ON `ticket`.`supervisor_id` = `user`.`id` WHERE `user`.`surname` LIKE '%surname4%' 

我曾试图改变名称的用户表:

public function getSupervisor() 
    { 
     return $this->hasOne(User::className(), ['id' => 'supervisor_id']) 
->from(User::tableName() . 'u2'); 
    } 

但这个错误返回:

You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 'u2.`id` 
WHERE `supervisor`.`surname` LIKE '%surname4%'' at line 1 The SQL being executed was: 
SELECT COUNT(*) FROM `ticket` LEFT JOIN `user` ON `ticket`.`user_id` = `user`.`id` LEFT JOIN `user`u2 ON 
`ticket`.`supervisor_id` = `user`u2.`id` WHERE `supervisor`.`surname` LIKE '%surname4%' 

回答

8

您别名之前错过了空间。应该是:

public function getSupervisor() 
{ 
    return $this->hasOne(User::className(), ['id' => 'supervisor_id']) 
     ->from(User::tableName() . ' u2'); 
} 

你也可以将它指定为数组键:

public function getSupervisor() 
{ 
    return $this->hasOne(User::className(), ['id' => 'supervisor_id']) 
     ->from(['u2' => User::tableName()]); 
} 

甚至joinWith()与此关系:

->joinWith([ 
    'supervisor' => function ($query) { 
     /* @var $query \yii\db\ActiveQuery */ 

     $query->from(User::tableName() . ' u2'); 
     // or $query->from(['u2' => User::tableName()]); 
    }, 
]); 

正式文件:

+0

对不起,我可以将答案标记为已接受吗?我必须这样编辑标题问题:“[Accepted] Yii2不是唯一表/别名:'user'” – 2015-02-01 09:13:43

+0

只需选中答案旁边的复选框(在左侧,在柜台下)。 – arogachev 2015-02-01 10:54:27

相关问题