我正在使用Yii2.0,当我使用关系进行过滤时出现以下错误:
异常(数据库异常)' yii \ db \ Exception'与消息 ' SQLSTATE [42S22]:找不到列:1054未知列 ' userContact.email'在' where子句'正在执行的SQL是: SELECT
tbl_user
。* FROMtbl_user
LEFT JOINtbl_user_contact
ONtbl_user
。id
=tbl_user_contact
。user_id
在哪里userContact
很明显,没有给出表名别名。以下是我生成上述查询的代码:
类文件
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.
给出的指示有没有办法在查询中使用别名?
答案 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();