首页 > 解决方案 > Yii2 ActiveRecord 链接/取消链接与多个模型

问题描述

在我的 Yii2 应用程序中,我有模型UserGroup并且Role具有以下关系:用户是组的成员,并且在这些组中具有角色,和/或全局角色。

我使用一个User_Role带有列的连接表UserIdRoleIdGroupId存储模型之间链接的信息。如果GroupIdNULL,则该角色是全局的,否则它包含用户具有该角色的组的 id。

据我了解,Yii2 的BaseActiveRecord::link/unlink机制并不是真的要(取消)链接两个以上的模型。链接工作正常,因为BaseActiveRecord::link需要一个可选extraColumns参数,我可以在其中传递 ['GroupId'=> ... ]. 但是,中没有这样的参数BaseActiveRecord::unlink,所以我不得不求助于一种解决方法:

 // class User
 // ...
 /**
   * Internal. Populated temporarily during relational queries.
   * @var int|null
   */
  public $groupId = null;

  /**
   * @return ActiveQuery
   */         
  public function getUserRoles()
  {
    $link = ['UserId' => 'id'];
    if( $this->groupId) $link['GroupId'] = "groupId";
    return $this->hasMany(User_Role::class, $link );
  } 

  /**
   * Returns the roles of the user, depending on the groupId property.
   * @return ActiveQuery
   */
  public function getRoles()
  {
    return $this
      ->hasMany( Role::class, ['id' => 'RoleId'] )
      ->via('userRoles', function(ActiveQuery $query){
        return $query->andWhere(['GroupId' => $this->groupId]);
      });
  }

并在取消链接或进行其他类型的查询之前设置groupId属性。

当然,我可以“手动”完成取消链接部分,而不是依赖unlink方法。但也许有更智能的多模型链接方式,不需要定制查询。有什么建议么?

谢谢你。

标签: sqlactiverecordyii2relational-database

解决方案


推荐阅读