Задать вопрос
@krov119

Как правильно составить sql запрос в YII2?

Запрос:

select T1.id, T2.name
from T1
left join T2 on
    T2.t1_id = T1.id and
    T2.user_id = 500
where T1.x > 0


Пробовал:
$query= T1::find()->select('T1.id, T2.name')->leftJoin('T2', 'T2.t1_id = T1.id and T2.user_id = 500')->andWhere(['>', 'T1.x', 0]);

Запрос отрабатывает правильно, но нет доступа к данным из таблицы T2, то есть $query->id существует, а $query->name нет.


Нагуглил что если нужны колонки из второй таблицы то надо через связи, я в модели T1 прописал:
public function getТ2() 
    { 
        return $this->hasMany(Т2::className(), ['t1_id' => 'id', 'user_id' =>  500]); 
    }

Но тут штука в том что нельзя указывать конкретное значение для связи, а только колонки таблиц, но в Т1 нет колонки с этим значением и быть не должно. Перенести же условие user_id=500 в where будет неправильно, мне нужно чтобы именно в условии leftjoin оно фигурировало.

P.S Натыкался на вариант решения через asArray() чтобы иметь доступ к колонкам второй таблицы, но в этом случае числовые типы приводятся к строковым, а этого совсем не хочется, да и наверняка же через ActiveRecord можно составить любой вопрос без костылей, в общем помогите пожалуйста, а то уже несколько дней не могу нужный запрос составить)
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
nskarl
@nskarl
Вообще дизайнер
public function getТ2() 
    { 
        return $this->hasMany(Т2::className(), ['t1_id' => 'id'])->onCondition(['user_id' =>  500]); 
    }


или

public function getТ2() 
    { 
        return $this->hasMany(Т2::className(), ['t1_id' => 'id'])->where(['user_id' =>  500]); 
    }


учите документацию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы