Mysql
 sql >> база данни >  >> RDS >> Mysql

Извличане на данни от таблицата за свързване в Yii2

Накратко :Използване на ActiveRecord за таблицата за свързване, както предложихте, е IMHO правилният начин, защото можете да настроите via() за да използвате този съществуващ ActiveRecord . Това ви позволява да използвате link() на Yii метод за създаване на елементи в таблицата за свързване, като същевременно добавяте данни (като вашия администраторски флаг).

Официалното ръководство на Yii 2.0 посочва два начина за използване на таблица за свързване:използване на viaTable() и с помощта на via() (вижте тук ). Докато първият очаква името на таблицата за свързване като параметър, вторият очаква име на релация като параметър.

Ако имате нужда от достъп до данните в таблицата за свързване, бих използвал ActiveRecord за таблицата за свързване, както сте предложили и използвайте via() :

class User extends ActiveRecord
{
    public function getUserGroups() {
        // one-to-many
        return $this->hasMany(UserGroup::className(), ['user_id' => 'id']);
    }
}

class Group extends ActiveRecord
{
    public function getUserGroups() {
        // one-to-many
        return $this->hasMany(UserGroup::className(), ['group_id' => 'id']);
    }

    public function getUsers()
    {
        // many-to-many: uses userGroups relation above which uses an ActiveRecord class
        return $this->hasMany(User::className(), ['id' => 'user_id'])
            ->via('userGroups');
    }
}

class UserGroup extends ActiveRecord
{
    public function getUser() {
        // one-to-one
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }

    public function getGroup() {
        // one-to-one
        return $this->hasOne(Group::className(), ['id' => 'userh_id']);
    }
}

По този начин можете да получите данните от таблицата за свързване без допълнителни заявки, като използвате userGroups релация (както при всяка друга връзка един към много):

$group = Group::find()->where(['id' => $id])->with('userGroups.user')->one();
// --> 3 queries: find group, find user_group, find user
// $group->userGroups contains data of the junction table, for example:
$isAdmin = $group->userGroups[0]->adminFlag
// and the user is also fetched:
$userName = $group->userGroups[0]->user->name

Всичко това може да се направи с помощта на hasMany отношение. Така че може да попитате защо трябва да декларирате връзката много към много с помощта на via() :Защото можете да използвате link() на Yii метод за създаване на елементи в таблицата за свързване:

$userGroup = new UserGroup();
// load data from form into $userGroup and validate
if ($userGroup->load(Yii::$app->request->post()) && $userGroup->validate()) {
    // all data in $userGroup is valid
    // --> create item in junction table incl. additional data
    $group->link('users', $user, $userGroup->getDirtyAttributes())
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PATINDEX() замяна в MYSQL

  2. Код на грешка:1055 несъвместим с sql_mode=only_full_group_by

  3. Генериране на кратък уникален идентификационен номер на PHP с помощта на auto_increment?

  4. Python JSON енкодер за поддръжка на дата и час?

  5. Функция MySQL POW() – Повишаване на стойност до степента на друга стойност