【问题标题】:Cakephp - Multiple Models for one TableCakephp - 一张桌子的多个模型
【发布时间】:2013-10-05 00:33:45
【问题描述】:

我有一个用户模型,用于存储牙科检查系统用户的数据。

通常存在三种类型的用户:AdministratorLocation ManagerExaminer

似乎有必要在我的应用程序中将这三个角色视为单独的模型(想象一下,我将如何为每个角色提供不同的视图以及不同的选项等......这是一场噩梦)。

我将如何设置每个模型中的关系。

我的第一个想法是:

//Administrator Model
class Administrator extends User {
    $name = 'Administrator';
    $table = 'User';
    $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'conditions' => array('User.role' => 'administrator'), 
        )
    );
}

然后用户模型将使用 hasMany 引用这个?就 CakePHP 约定而言,如何准确地建模呢?

另外,这个模型会扩展 User 模型还是 AppModel?

【问题讨论】:

  • 为什么?!你不能只根据角色为每个用户添加一个带有相关数据的“选项”模型吗?
  • 我同意为每种用户类型设置完全不同的模型可能不是最好的设计。但我不知道足够的细节来确定。至于您的问题 - 用户模型应该只有管理员、位置管理员或审查员之一,所以 hasOne 应该是关系。很可能您只希望其他模型、管理员等扩展 AppModel,而不是 User。

标签: php cakephp


【解决方案1】:

当然,您可以使用相同的表名创建不同的模型。为此,请使用 $useTable 属性(不是 $table)将每个模型与特定表链接:

class Administrator extends AppModel {
    public $useTable = 'User';
}

但我不知道有任何 CakePHP 模型属性可以让您在获取结果时过滤返回的数据...您只能在将模型与另一个模型链接时编写自己的条件,例如:

class SomeOtherModel extends AppModel {
    public $hasMany = array(
        'Administrator' => array(
            'className' => 'Administrator',
            'conditions' => array('Administrator.role' => 'administrator')
        )
    );
}

这不是一个好的解决方案,因为它仅在对 SomeOtherModel 模型执行查询时才有效。

您也可以尝试将 afterFind() 回调应用于您的管理员/审查员/...模型,这将删除其他角色的用户而不是需要,但这当然不是一个有效的解决方案。

另一种解决方案是创建不同的数据库视图,其中仅包含选定角色的用户(更多关于视图 - here)。然后您可以将每个视图指向您的 CakePHP 模型,就像它是一个普通的数据库表一样。 但这个解决方案也并不完美。如果将来您必须添加新用户角色或更改表架构,您还必须修改数据库视图。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2012-05-23
    • 2017-02-07
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2011-09-25
    相关资源
    最近更新 更多