@yura_born

Как сделать выборку из промежуточной таблицы?

Здравствуйте! Разбираюсь с Yii2 и что-то никак не могу толком понять как выбирать данные из 3-х таблиц в ActiveRecord

у меня к примеру 3 таблицы:
1. sotrudniki
2. rank
3. sotrRank

Создал 3 модели для каждой таблицы.
В модели Sotrudniki делаю связи:
public function getSotrrank()
    {
        return $this->hasMany(SotrRank::className(), ['sotr_code' => 'code']);
    }

    public function getRank(){
        return $this->hasMany(RankList::className(), ['id' => 'rank_code'])->via('sotrrank');
    }


В контроллере делаю выборку и передаю в вид:
public function actionSql()
    {
        $sotrudniki = Sotrudniki::find()->where(['code' => '70100001095'])->all();

        return $this->render('sql', [
            'sotrudniki' => $sotrudniki
        ]);
    }


в виде вывожу:
/** @var \frontend\models\Sotrudniki $sotrudnik */

foreach ($sotrudniki as $sotrudnik){
    echo '<h2>—отрудник - '.$sotrudnik->fam.'</h2><br/>' ;
    foreach($sotrudnik->sotrrank as $sotrrank){
        echo 'id - в св¤занной таблице - '.$sotrrank->id.' - '.$sotrrank->sotr_code.' - '.$sotrrank->rank_code.' - '.$sotrrank->date_start.' - '.$sotrrank->date_end.' - '.$sotrudnik->rank.'<br/>';
    }
}


Информация из модели сотрудника выводится, а вот $sotrudnik->rank где должна быть должность сотрудника не выводится, в это свойство возвращается массив из всех должностей у которых совпадают id с rank_code.
Может еще нужно какое-то условие? или я не правильно вывожу..... не могу понять.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
yura_born, ну тогда должно быть как-то так
Сотрудники:
id - primaryKey
name - имя сотрудника
surname - фамилия сотрудника

SotrRank
id - primaryKey
id_employee - id сотрудника из таблицы Sotrudnik
id_position - id должности

RankList
id - primaryKey
name - название должности

Вам надо получить когда и какую должность занимал сотрудник. В модели Sotrudnik делаем связь на SotrRank
public function getSotrRank()
{
     return $this->hasMany(SotrRank::class, ['id_employee' => 'id');
}

Но так получите только id должности, вместо названия. Поэтому в модели SotrRank делаете связь на RankList
public function getRank()
{
     return $this->hasOne(Rank::class, ['id' => 'id_position');
}

И выводите в цикле
// действие
public function actionSql($code)
    {
        $employee = Sotrudniki::find()->where(['code' => $code])->all();

        return $this->render('sql', [
            'employee' => $employee
        ]);
    }
// вид sql
foreach($employee as $value){
    echo $value->name; // имя сотрудника
    // ещё один цикл для получения данных по связи SotrRank
    foreach($value as $sotrRank){
    // получить название должности через связь Rank
     echo $sotrRank->rank->name;
    }

}

Вот как-то так.

p.s. Обязательно будут ошибки, но Вы их сами исправите, я уверен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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