sql - Yii2 ActiveRecord 链接/取消链接与多个模型
问题描述
在我的 Yii2 应用程序中,我有模型User
,Group
并且Role
具有以下关系:用户是组的成员,并且在这些组中具有角色,和/或全局角色。
我使用一个User_Role
带有列的连接表UserId
,RoleId
并GroupId
存储模型之间链接的信息。如果GroupId
是NULL
,则该角色是全局的,否则它包含用户具有该角色的组的 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
方法。但也许有更智能的多模型链接方式,不需要定制查询。有什么建议么?
谢谢你。
解决方案
推荐阅读
- docker - docker-compose 和 docker cli 之间的音量模式行为
- mysql - 在 phpmyadmin 中从列转换为行
- r - 我写的函数中缺少()的问题
- node.js - Joi错误验证在节点js中抛出错误
- html - 基于包含标签、文本框和 div 占位符的布局设计 HTML 表单
- javascript - 如何在给定的选择器之后停止 puppeteer 抓取?
- javascript - HEAD中的Element在connectedCallback中立即删除()本身是否安全,但在disconnectedCallback中访问自己
- python - 虚线检测 CV2 Python
- python - 接受 SQL 查询并从数据库返回执行查询的结果的 Django Rest API
- c++ - 在课堂上使用这个引用是否安全?