En resumen :Usando un ActiveRecord
para la tabla de unión como sugirió es en mi humilde opinión la forma correcta porque puede configurar via()
para usar ese ActiveRecord
existente . Esto te permite usar el link()
de Yii método para crear elementos en la tabla de unión mientras agrega datos (como su indicador de administrador) al mismo tiempo.
La Guía oficial de Yii 2.0 establece dos formas de usar una tabla de unión:usando viaTable()
y usando via()
(ver aquí
). Mientras que el primero espera el nombre de la tabla de unión como parámetro, el último espera un nombre de relación como parámetro.
Si necesita acceder a los datos dentro de la tabla de unión, usaría un ActiveRecord
para la tabla de unión como sugirió y 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']);
}
}
De esta manera, puede obtener los datos de la tabla de unión sin consultas adicionales utilizando los userGroups
relación (como con cualquier otra relación de uno a muchos):
$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
Todo esto se puede hacer usando hasMany
relación. Entonces puede preguntar por qué debería declarar la relación de muchos a muchos usando via()
:Porque puedes usar el link()
de Yii método para crear elementos en la tabla de unión:
$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())
}