- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 my_users
表,现在我需要通过删除 role
列来重构它,以支持每个用户支持多个角色。例如,我正在处理的 3 种用户类型是:
所以表格设置如下所示:
Users.php
use CakeDC\Users\Model\Table\UsersTable as BaseUsersTable;
class UsersTable extends BaseUsersTable
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setEntityClass('Users\Model\Entity\User');
$this->belongsToMany('UserRoles', [
'through' => 'users_user_roles'
]);
$this->hasMany('UsersUserRoles', [
'className' => 'Users.UsersUserRoles',
'foreignKey' => 'user_id',
'saveStrategy' => 'replace',
]);
}
public function findRole(Query $query, array $options)
{
return $query
->innerJoinWith('UserRoles', function($q) use ($options) {
return $q->where(['role_key' => $options['role_key']]);
});
}
}
MyUsersTable.php
class MyUsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('my_users');
$this->setPrimaryKey('user_id');
$this->belongsTo('Users', [
'className' => 'Users.Users',
'foreignKey' => 'user_id',
]);
}
/**
* @param Cake\Event\Event $event
* @param Cake\ORM\Query $query
* @param ArrayObject $options
*/
public function beforeFind(Event $event, Query $query, \ArrayObject $options)
{
// set the role
if (defined(static::class.'::ROLE') && mb_strlen(static::ROLE) > 0) {
$role = static::ROLE;
// set user conditions
$query->innerJoinWith('Users', function($query) use ($role) {
return $query->find('role', [
'role_key' => $role,
]);
});
}
}
/**
* @param \Cake\ORM\Query $query
* @param array $options
*/
public function findByRegistrationCode(Query $query, array $options): Query
{
$query->where([
$this->aliasField('registration_no') => $options['registration_no']
]);
return $query;
}
}
FightersTable.php
use MyUsers\Model\Table\MyUsers;
class FightersTable extends MyUsersTable
{
const ROLE = 'fighter';
public function initialize(array $config)
{
parent::initialize($config);
$this->setEntityClass('Fighters\Model\Entity\Fighter');
}
/**
* @param Validator $validator
* @return Validator $validator
*/
public function validationDefault(Validator $validator): Validator
{
$validator = parent::validationDefault($validator);
$validator->allowEmpty('field');
}
}
RefereesTable.php
和 ManagersTable.php
类似于 FightersTable
但有自己的验证规则,可能有自己特殊的实体虚拟属性什么不是。
问题:有没有更简单的方法来构建它,或者更具体地说,有一种替代方法来执行 beforeFind
来区分角色?如果对 role
的要求与用户保持 1:1 的比例,我可能会做这样的事情:
$this->belongsTo('Fighters', [
'conditions' => [
'role' => 'fighter'
],
'foreignKey' => 'user_id',
'className' => 'MyUsers',
]);
我将不胜感激任何关于重构它的见解。
最佳答案
您可以定义belongsTo
关联以使用findByRole
finder :
$this->belongsTo('Fighters', [
'foreignKey' => 'user_id',
'className' => 'MyUsers',
'finder' => ['byRole' => ['role' => 'fighter']]
]);
当然,您必须在 MyUsers
中定义查找器:
public function findByRole(Query $query, \ArrayObject $options)
{
$role = $options['role'];
// set user conditions
$query->innerJoinWith('Users', function($query) use ($role) {
return $query->find('role', [
'role_key' => $role,
]);
});
}
}
我还会将 beforeFind
逻辑提取到 RoleBehavior
或 MultiRoleBehavior
behavior , IE。:src/Model/Behavior/RoleBehavior.php
:
<?php
namespace App\Model\Behavior;
use Cake\ORM\Behavior;
use Cake\ORM\Query;
use Cake\Event\Event;
/**
* Role-specific behavior
*/
class RoleBehavior extends Behavior
{
/**
* @var array multiple roles support
*/
protected $_defaultConfig = [
'roles' => []
];
public function initialize(array $config)
{
parent::initialize($config);
if (isset($config['roles'])) {
$this->config('roles', $config['roles'], false /* override, not merge*/);
}
}
public function beforeFind(Event $event, Query $query, \ArrayObject $options, $primary) {
// set user conditions
$query->innerJoinWith('Users', function($query) use ($roles) {
return $query->find('role', [
'role_key' => $roles,
]);
});
}
}
它使用多个角色,但如果需要,您可以简单地将其更改为单个角色。这里还有一些其他要做的事情——可能将 $query->innerJoinWith('Users'...
提取到行为中的一个单独的方法中,并在 MyUsers::findByRole(. ..)
...
接下来,您可以将此行为直接附加到扩展类中,只需将静态 ROLE
替换为行为配置即可:
use MyUsers\Model\Table\MyUsers;
class FightersTable extends MyUsersTable
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setEntityClass('Fighters\Model\Entity\Fighter');
$this->addBehavior('Role', [ 'roles' => ['fighter']]);
}
}
或者您可以通过将行为附加到 MyUsers
表(即来自 Controller )来管理特定于角色的逻辑:
$this->MyUsers->addBehavior('Role', ['roles' => ['manager']])
You also can change the behavior setup on the fly :
$this->MyUsers->behaviors()->get('Role')->config([
'roles' => ['manager'],
]);
希望对你有帮助。
关于php - 我可以使用同一张表以不同方式/以更 Cake 的方式重构我的多个用户类型的设置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799073/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!