我有一个my_users表,我现在需要通过删除角色列来重构它,以支持每个用户支持多个角色.例如,我正在处理的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以区分角色?如果角色的要求与用户保持1:1,我可能会做这样的事情:
$this->belongsTo('Fighters', [
'conditions' => [
'role' => 'fighter'
],
'foreignKey' => 'user_id',
'className' => 'MyUsers',
]);
我很欣赏任何有关重组的见解.