Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pobierz dane z tabeli połączeń w Yii2

W skrócie :Korzystanie z ActiveRecord dla tabeli połączeń, jak zasugerowałeś, IMHO jest właściwą drogą, ponieważ możesz skonfigurować via() aby użyć istniejącego ActiveRecord . Pozwala to na użycie link() Yii metoda tworzenia elementów w tabeli połączeń przy jednoczesnym dodawaniu danych (takich jak flaga administratora).

Oficjalny przewodnik po Yii 2.0 podaje dwa sposoby wykorzystania tablicy połączeń:użycie viaTable() i używając via() (zobacz tutaj ). Podczas gdy pierwsza oczekuje nazwy tabeli połączeń jako parametru, druga oczekuje nazwy relacji jako parametru.

Jeśli potrzebujesz dostępu do danych w tabeli połączeń, użyję ActiveRecord dla tabeli połączeń zgodnie z sugestią i użyj 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']);
    }
}

W ten sposób możesz uzyskać dane tabeli połączeń bez dodatkowych zapytań za pomocą userGroups relacja (jak w przypadku każdej innej relacji jeden-do-wielu):

$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

To wszystko można zrobić za pomocą hasMany relacja. Możesz więc zapytać, dlaczego powinieneś deklarować relację wiele-do-wielu za pomocą via() :Ponieważ możesz użyć link() Yii metoda tworzenia elementów w tabeli połączeń:

$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. Instalacja MySQL

  2. Jak wybrać podkategorie z wybranej kategorii za pomocą zagnieżdżonej funkcji w PHP?

  3. Importuj plik .sql w programie Access

  4. Wyszukiwanie numerów telefonów w mysql

  5. Metody asynchroniczne MySQL C# nie działają?