cakePHP 3 中的自链接模型并从连接中检索数据 table

Self linking model in cakePHP 3 and retrieving data from the join table

我正在使用 cakePHP 3.0 创建 WebApp。

我有一个用户模型和 Table 它拥有并属于许多用户。

所以我根据蛋糕惯例设置了tables:

CREATE TABLE IF NOT EXISTS `users`
(
user_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
);

和 JOIN table:

CREATE TABLE IF NOT EXISTS `users_users`
(
supervisor_id int,
employee_id int,
FOREIGN KEY (supervisor_id) REFERENCES users(user_id),
FOREIGN KEY (employee_id) REFERENCES users(user_id)
);

在我的 UserTable.php 中,我创建了这些关联:

    $this->table('users');
    $this->primaryKey('user_id');

    $this->belongsTo('Users', [
                'foreignKey' => 'user_id',
                'joinType' => 'INNER'
   ]);

    $this->belongsToMany('Supervisors', [
                'className' => 'Users',
                'targetForeignKey' => 'supervisor_id'
    ]);
    $this->belongsToMany('Employees', [
                'className' => 'Users',
                'targetForeignKey' => 'employee_id'
    ]);

现在在一个新的模型方法中,我想获得一名员工的主管:

public function getSupervisorEmail($user_id) {
        $supervisors = $this->Employees->Supervisors->find()->select(['user_id']);
        debug($supervisors);
        return $supervisors;
    }

我将示例数据放入 users_users Table,但我不知道如何访问这些条目。上面函数中的查询没有按照我的预期进行。它只是 returns 来自我的用户 Table 的记录而没有加入 users_users Table 我不明白的是因为我根据 cakePHP 3 的命名约定设置了所有...

如何访问我的加入 Table 并获取相关记录? EG 获取与 user_id 用户关联的主管 1. 我尝试了不同的查询,但 none 使用了我的连接 table.

感谢解答!

在HABTM 的through 选项中指定join table 对象(在3.0 中已重命名为belongsToMany / BTM)assoc。否则它将根据 table 名称变形并构造一个 Table 对象实例。我会 总是 创建连接 table 对象,所以现在就烘焙它。

http://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations

through Allows you to provide a either the name of the Table instance you want used on the join table, or the instance itself. This makes customizing the join table keys possible, and allows you to customize the behavior of the pivot table.

您没有查询其他关联。 contain() 您在查询中加入 table 模型。

http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#eager-loading-associations

By default CakePHP does not load any associated data when using find(). You need to ‘contain’ or eager-load each association you want loaded in your results.

$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);

问题是我理解错了。调试查询时的 SQL 语句不会显示 cakePHP 内部发生的所有 SQL 内容,因此您看不到自动连接。

但现在我发现它可以通过像 cakePHP 书中那样回显测试数据来完美工作 http://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations

感谢@burzum 试图帮助我提供的链接总是有用的。

$users = $this->Users->find('all', [
            'order' => [],            
            'conditions' => ['Users.id' => 1],
            'contain' => ['Supervisors','Employees']
                ]
        );

使用这个