@ProFM

Как связать и обращаться к связанным таблицам в Yii2?

Доброе утро. Что то не могу никак понять, как работать со связанными таблицами, есть 3 таблицы:

social
5b2b5a5e8863b413244862.png
user
5b2b5a992e3e9149403343.png
social_users
5b2b5a8658dc9905999697.png


Как вы поняли, social и user я объединил в одну таблицу social_users, чтобы потом было удобнее динамически обновлять данные. Но вот проблема, я никак не могу понять, как выводить данные во вью из этой таблицы, чтобы автоматом все данные брались из связанных таблиц по их id..... Уверен что ответ на поверхности как обычно, но найти никак не могу, помогите пожалуйста.

И вот связи в моделях:

Social.php
public function getSocialUsers()
    {
        return $this->hasMany(SocialUsers::className(), ['social_id' => 'id_social']);
    }

user.php
public function getSocialUsers()
    {
        return $this->hasMany(SocialUsers::className(), ['user_id' => 'id_user']);
    }

SocialUsers.php
public function getUser()
    {
        return $this->hasMany(User::className(), ['id_user' => 'user_id']);
    }

    public function getSocial()
    {
        return $this->hasMany(Social::className(), ['id_social' => 'social_id']);

    }



Во views:

ProfileController.php
public function actionIndex()
    {
        $id = Yii::$app->user->identity['id_user'];
        $profile = Profile::find()->where(['user_id' => $id])->asArray()->one();
        $socials = SocialUsers::find()->asArray()->all();

        return $this->render('index', [
            'profile' => $profile,
            'socials' => $socials,
        ]);
    }
index.php
<?php if(isset($socials)):?>
            <div class="list-group">
        <?php foreach ($socials as $social):?>
                <a href="#" class="list-group-item"><i class="fa fa-facebook"></i> </a>
        <?php endforeach;?>
            </div>
    <?php endif;?>


Получаю:
site
5b2b5d147095b239134046.png


Я понимаю, что я получаю вообще все данные из таблицы, и они никак не привязаны ни к пользователю, ни к таблице с соц сетями. Как работают вообще эти связи, и зачем они?
  • Вопрос задан
  • 787 просмотров
Пригласить эксперта
Ответы на вопрос 1
kimono
@kimono
Web developer
class Social extends ActiveRecord {
  public function getPivotSocialUser(){
    return $this->hasMany(SocialUser::class, ['social_id' => 'id');
  }
  public function getUsers(){
    return $this->hasMany(User::class, ['id' => 'user_id')->via('pivotSocialUser');
  }
}

class User extends ActiveRecord {
  public function getPivotSocialUser(){
    return $this->hasMany(SocialUser::class, ['user_id' => 'id');
  }
  public function getSocials(){
    return $this->hasMany(Social::class, ['id' => 'social_id')->via('pivotSocialUser');
  }
}


view.php
$social = Social::findOne(['name' => 'facebook']);
var_dump($social->users); // все пользователи фейсбука
$user = User::findOne(['name' => 'admin']);
var_dump($user->socials); // все социальные сети админа
Ответ написан
Ваш ответ на вопрос

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

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