Псевдоним таблицы 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,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();

Я следую инструкциям, приведенным здесь.

Есть ли способ иметь псевдоним в запросе?

2 ответа

Используйте метод "псевдоним ('строка')".

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

Посмотри этот документ API

В 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,
    ]);
Другие вопросы по тегам