Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Recuperar dados da tabela de junção no Yii2


Resumindo :Usando um ActiveRecord para a tabela de junção como você sugeriu é IMHO o caminho certo porque você pode configurar via() para usar esse ActiveRecord existente . Isso permite que você use o link() do Yii método para criar itens na tabela de junção enquanto adiciona dados (como seu sinalizador de administrador) ao mesmo tempo.

O Yii Guide 2.0 oficial afirma duas maneiras de usar uma tabela de junção:usando viaTable() e usando via() (consulte aqui ). Enquanto o primeiro espera o nome da tabela de junção como parâmetro, o segundo espera um nome de relação como parâmetro.

Se você precisar acessar os dados dentro da tabela de junção, eu usaria um ActiveRecord para a tabela de junção como você sugeriu e use 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']);
    }
}

Dessa forma, você pode obter os dados da tabela de junção sem consultas adicionais usando o userGroups relação (como em qualquer outra relação um-para-muitos):
$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

Isso tudo pode ser feito usando o hasMany relação. Então você pode perguntar por que você deve declarar a relação muitos-para-muitos usando via() :Porque você pode usar o link() do Yii método para criar itens na tabela de junção:
$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())
}