Псевдоним таблицы Yii 2.0 в запросе SQL
Я использую Yii2.0, и у меня возникает следующая ошибка при выполнении фильтрации с отношением:
Исключение (Исключение базы данных) "yii\db\Exception" с сообщением "SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец" userContact.email "в" выражении where "Выполнение SQL было: SELECT
tbl_user
.* ОТtbl_user
ЛЕВЫЙ РЕЙТИНГtbl_user_contact
НАtbl_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();
Я следую инструкциям, приведенным здесь.
Есть ли способ иметь псевдоним в запросе?
2 ответа
Используйте метод "псевдоним ('строка')".
User::find()->alias('u')->joinWith(['userContacts' => function($query) use ($email){
$query->alias('uc')->where(['uc.email' => $email])
}])
->one();
В MySQL ваша пользовательская таблица называется tbl_user_contact
, Тем не менее, вы ссылаетесь на это как userContact
, что приводит к ошибке.
При добавлении условий вы должны ссылаться на поля, используя фактическое имя таблицы. Вот правильный код:
User::find()->joinWith('userContacts', false)
->where([UserContact::tableName().'.email' => $email])
->one();
Вы могли бы просто заменить UserContact::tableName().'.email'
с tbl_user_contact.email
, но используя tableName()
это лучшая практика.
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,
]);