@krov119

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

Здравствуйте. Уже нервов не хватает, поэтому прошу помочь составить sql-запрос на yii2. Примеры из документации у меня не пашут, точнее не получается их подстроить под свои нужды. К сути: есть две таблицы T1(id, name, created_at) и T2(id, user_id, t1_id). Как будет выглядеть следующий запрос в yii2:

select *
from T1
left join (
  select t2_id
  from T2
  where user_id = 200
) t2 on
    t2.t1_id = t1.id
where created_at > 0


Пробовал что-то такое глядя в документацию:

class T1 extends ActiveRecord
{
    public function getT2()
    {
        return $this->hasOne(T2::className(), ['id' => 't1_id']);
    }
}

class T2 extends ActiveRecord
{
    public function getT1()
    {
        return $this->hasOne(T1::className(), ['t1_id' => 'id']);
    }
}

$T2 = T2::find()->where(['=', 'user_id', 200]);
$T1 = $T2->getT1()->where(['>', 'created_at', 0])->orderBy('id desc')->all();

Но получаю ошибку "Calling unknown method: yii\db\ActiveQuery::getT1()"


Буду признателен как за готовые решения, так и за любого вида рекомендации.
  • Вопрос задан
  • 545 просмотров
Решения вопроса 1
kawabanga
@kawabanga
1) Конкретно для вашего запроса вы можете использовать подобный код:

T1::find()->andWhere(['id in ( select t2_id
  from T2
  where user_id = :user_id) ',['user_id'=>200]])->andWhere(['>', 'created_at', 0])->all()

В этом случае у вас сохраняется подзапрос, и смысл его использовать только если вы заранее знаете, что записей там мало, и вытащить их нужно именно так.

2) Ваш запрос вы можете переписать как:
select t1.*,t2.t2_id
from T1
left join t2   on
    t2.t1_id = t1.id
where created_at > 0 and t2.user_id=200


Этот вариант правильней, так как он использует полноценный джоин.
А дальше у вас есть два подварианта -
а)
T1::find()->leftJoin('t2','t2.t1_id = t1.id')->andWhere(['t2.user_id'=>'200'])->andWhere(['>', 'created_at', 0])->all()


б)
Прописать связи , у вас вроде бы правильно, и далее -
T1::find()->joinWith(['t2'])->andWhere(['t2.user_id'=>'200'])->andWhere(['>', 'created_at', 0])->all()

В этом случае происходит жадная загрузка, и в модели вы сможете получить $t1->t2->$param.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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