Belongsto表与自身之间的关系

时间:2018-01-05 12:47:49

标签: cakephp database-design many-to-many cakephp-3.x

我有一个带有表用户的数据库,我需要存储有关它们之间的一种关系的信息:有权管理其他用户的用户。此外,这些托管用户也可以是管理员,因此任何用户都可以是经理或由包括他们自己在内的任何其他用户管理(2个用户可以是彼此的经理)。

因此,我想到的唯一想法是创建一个包含以下字段的“连接”表:

manager_id (key field that links to a user_id)
managed_id (key field too that links to a user_id as well)

但同一个表之间的连接表,会产生哪种关系?

用户 - > belongsToMany('用户')??

这可以吗?

(在ndm回答后编辑)

我使用ndm告诉我的方法收到错误。

所以,在UsersTable.php中我现在有:

$this->belongsToMany('Managers', [
            'className' => 'Users',
            'foreignKey' => 'manager_id',
            'targetForeignKey' => 'user_id'
         ]);

在数据库“test.sql”表中,managers_users有2个字段:

manager_id
user_id

两个关键字段

但是当我尝试从UsersController.php查询时:

$query = $this->Users->find()
                ->contain(['Managers'])
                ->all()
                ;

我收到错误:SQLSTATE [42S02]:找不到基表或视图:1146表'test.users_users'不存在

任何帮助?

1 个答案:

答案 0 :(得分:1)

联接表通常涉及belongsToMany关联,它基本上是hasManybelongsTo的组合,也可以手动表达,也可以表示使用hasOnebelongsTo,它实际上取决于您的应用程序的需求,因此您可能应首先评估您的应用程序在何种情况下需要查询数据,然后从那里开始。

一般来说,自我关联很好(参见Cookbook协会章节中的介绍),所以是的,在市政当局可以,但是你需要设置/配置一些不同的东西以便这个要正常工作,那就是您需要使用唯一的别名,例如Managers而不是Users,然后您的外键字段需要适应约定,即user_id(托管用户)和manager_id(管理用户),或者您必须在关联配置中相应地配置它们:

$this->belongsToMany('Managers', [
    'className' => 'Users',

    //'foreignKey' => 'managed_id',
    //'targetForeignKey' => 'manager_id'
]);

另见