KirraBu
@KirraBu
Начинающий программист

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

Я новичек в PHP и Yii2 поэтому возникает много вопросов.

Есть две таблицы

device [id, type_id, name]
device_type [id, type_name, category]

связаны по полю type_id

Как правильно выбрать все записи device у которых device_type.category равен определённому значению, чтобы потом отобразить в GridViev ?

После поисков и раздумий у меня в контроллере получилось вот такое
$device = new ActiveDataProvider([
            'query' => Device::find()
                ->from('device')
                ->leftJoin('device_type', 'device_type.id=device.type_id')
                ->where(['device_type.category' => 3]),
        ]);


Ещё один вопрос: если надо отобразить несколько одинаковых таблиц по категориям, как избавиться от повторения кода в контроллере ?
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Используйте связи для таблиц.
Например:
public functon getType(){
   return $this->hasOne(Model_name::className(), ['category' => 'type_id'])
}

В контроллере ActiveDateProvider() получите так:
$query = Device::find()->with('type')
$device = new ActiveDataProvider([
    'query' => $query
])

В gridview получить значение можно так:
[
   'attribute' => 'id'
   'value' => 'type.name'
]

Подробней здесь(Работа со связными данными)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
KirraBu
@KirraBu Автор вопроса
Начинающий программист
slo_nik Спасибо зо ответ.
по Вашей ссылке нашел ответ.
Может кому пригодится.
Для обращения к полям связанной таблицы в запросе ActiveDateProvider()
$device = new ActiveDataProvider([
            'query' => Device::find()
                ->joinWith('type')
                ->where(['device_type.category'=>2]),
        ]);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы