代码之家  ›  专栏  ›  技术社区  ›  Baalhug

表与自身之间的归属关系

  •  2
  • Baalhug  · 技术社区  · 8 年前

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

    所以我想到的唯一想法就是创建一个包含以下字段的“联接”表:

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

    但是一个连接表在同一个表之间,会产生什么样的关系呢?

    用户->是否属于“用户”??

    这样可以吗?


    (ndm应答后编辑)

    使用ndm告诉我的方法,我遇到了一个错误。

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

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

    在数据库“test.sql”表managers\u中,用户有2个字段:

    manager_id
    user_id
    

    两个关键字段

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

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

    我得到错误:SQLSTATE[42S02]:找不到基表或视图:1146 table'test。users\u users不存在

    有什么帮助吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   ndm    8 年前

    联接表通常涉及 belongsToMany 关联,基本上是 hasMany belongsTo 也可以手动表示,也可以使用 hasOne 贝朗斯托 ,这实际上取决于应用程序的需要,因此您可能应该首先评估应用程序在什么情况下需要如何查询数据,然后再从那里开始。

    一般来说,自我关联是可以的(参见烹饪书关联一章中的介绍),所以是的,在原则上也可以,但是为了让它正常工作,您需要设置/配置一些不同的东西,也就是说,您需要使用一个唯一的别名,例如 Managers 而不是 Users ,然后您的外键字段需要根据约定进行调整,即 user_id (托管用户)和 manager_id (管理用户),或者您必须在关联配置中相应地配置它们:

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

    另请参见