cakePHP 3中的自链接模型,并从连接表

时间:2016-05-30 10:42:37

标签: php cakephp join cakephp-3.0 has-and-belongs-to-many

使用cakePHP 3.0创建WebApp。

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

所以我根据蛋糕惯例设置表格:

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

和JOIN表:

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表中,但我不知道如何访问这些条目。上面函数中的查询没有做我期望它做的事情。它只是从我的用户表中返回一条记录,而没有加入users_users表我不明白,因为我根据cakePHP 3的命名约定设置了所有...

如何访问我的联接表并获取相关记录? EG通过user_id 1获取与用户关联的主管。我尝试了不同的查询但没有使用我的联接表。

感谢您的回答!

3 个答案:

答案 0 :(得分:2)

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

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

  

允许您提供要在连接表上使用的Table实例的名称,或者提供实例本身。这样可以自定义连接表键,并允许您自定义数据透视表的行为。

您不是在查询其他关联。在查询中包含()您的连接表模型。

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

  

默认情况下,使用find()时,CakePHP不会加载任何关联数据。您需要“包含”或急切加载要在结果中加载的每个关联。

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

答案 1 :(得分:1)

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

但现在我发现它完美地通过回应像cakePHP书http://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations

中的testdata

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

答案 2 :(得分:0)

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

使用此