SQL查询中的Yii 2.0表别名

时间:2015-12-25 08:01:27

标签: yii2

我正在使用Yii2.0,当我使用关系进行过滤时出现以下错误:

  

异常(数据库异常)' yii \ db \ Exception'与消息   ' SQLSTATE [42S22]:找不到列:1054未知列   ' userContact.email'在' where子句'正在执行的SQL是:   SELECT tbl_user。* FROM tbl_user LEFT JOIN tbl_user_contact ON   tbl_userid = tbl_user_contactuser_id在哪里   userContact email =' me@me.com'

很明显,没有给出表名别名。以下是我生成上述查询的代码:

类文件

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

查询

User::find()->joinWith('userContacts', false)
    ->where(['userContact.email' => $email])
    ->one();

我按照here.

给出的指示

有没有办法在查询中使用别名?

3 个答案:

答案 0 :(得分:0)

在MySQL中,您的用户表称为tbl_user_contact。但是,您将其称为userContact,这会导致错误。

添加条件时,应使用实际表名称引用字段。这是正确的代码:

User::find()->joinWith('userContacts', false)
    ->where([UserContact::tableName().'.email' => $email])
    ->one();

您可以将UserContact::tableName().'.email'替换为tbl_user_contact.email,但使用tableName()是更好的做法。

答案 1 :(得分:0)

ActiveQuery扩展了Query,您可以在ActiveQuery中使用查询方法:

    $query = \app\models\db\AnuncioConsulta::find();
    $query->from(\app\models\db\AnuncioConsulta::tableName() . ' as ac' );

    $query->join = [
       ['INNER JOIN', 'anuncio as a'  , ' a.id = ac.anuncio_id AND a.status = 1 '],
       ['INNER JOIN', 'autor as au'   , ' au.id = a.autor_id AND au.agente_inmobiliario = 0 '],
       ['INNER JOIN', 'usuario as u'  , ' u.id = au.object_id '],
    ];

    $query->andWhere('ac.news      =:status' , [':status' =>  1 ]);
    $query->andWhere('ac.delete    =:status' , [':status' =>  0 ]);
    $query->andWhere('u.id         =:userId' , [':userId' => Yii::$app->user->id ]);

    return new \yii\data\ActiveDataProvider([
        'query' => $query,
    ]);

答案 2 :(得分:0)

使用方法“ alias('string')”。

User::find()->alias('u')->joinWith(['userContacts' => function($query) use ($email){
  $query->alias('uc')->where(['uc.email' => $email])
 }])
->one();

Look this API doc