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

Добавление массивов в ответ сервера. REST на Yii2?

Есть страница с вакансиями, где отображены вакансии по работодателю. Нужно с сервера вернуть пачку вакансий и информацию о работодателе, чтобы отобразить название компании, чтобы люди могли видеть, кому принадлежат эти вакансии. Как это сделать?

Есть ActiveDataProvider:

$vacancies = new ArrayDataProvider([
            'allModels' => Vacancy::find()->where(['creator' => $creator]),
            'pagination' => [
                'pageSize' => 30
            ]
       ]);
return $vacancies;


Все это работает хорошо. Присутствует пагинация и все такое.

Но это только пачка вакансий. Есть так же запрос на информацию о работодателе, который возвращает название компании:

$employer = Profile::find()->select('company')->where(['user' => $creator])->one();


Как все это объединить и отослать на клиент так, чтобы у меня были и вакансий пачка с пагинацией и инфа о работодателе??
  • Вопрос задан
  • 391 просмотр
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Необходимо настроить связи между моделями.
Выглядит это примерно так:
Модель Profile
В таблице профиля берётся id записи, в данном случае "id" и ищется в таблице вакансий, в которой должен быть "id_company" соответствующий id профиля компании.
public function getVacancy()
{
    return $this->hasMany(Vacancy::class, ['id_company' => 'id']); // у одного профиля может быть много вакансий
}

Модель Vacancy
public function getProfile()
{
    return $this->hasOne(Profile::class, ['id' => 'id_company']); // у одной вакансии может быть только один профиль.
}

Тогда Ваш запрос превращается в такой:
$vacancies = new ArrayDataProvider([
            'allModels' => Vacancy::find()->with('profile')->where(['creator' => $creator]),
            'pagination' => [
                'pageSize' => 30
            ]
       ]);
return $vacancies;

Получить имя профиля можно так
echo $vacancies->profile->company;
Подробней здесь.
Ответ написан
Ваш ответ на вопрос

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

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