为什么我的蛋糕会加入LEFT JOIN?

时间:2015-01-15 22:05:00

标签: cakephp join

我正在加入两个HABTM关系。

我有一个名为projects的表,它与users表有一个HABTM关系。它使用中间表projects_users来实现其HABTM关系。

然后users表与部门有HABTM关系(使用department_users表)。 这是我的join语句(在我的projects_controller中):

$projectsUsersDepartments['joins'] = array(
    array('table' => 'users',
        'alias' => 'User',
        'type' => 'inner',
        'conditions' => array(
            'User.id = ProjectsUser.user_id'
        )
    ),
    array('table' => 'departments_users',
        'alias' => 'DepartmentsUser',
        'type' => 'inner',
        'conditions' => array(
            'DepartmentsUser.user_id = User.id'
        )
    )
);

$projectsUsersDepartments['conditions'] = array(
    'ProjectsUser.project_id' => 1,
    'DepartmentsUser.department_id' => 25
);

$projectsUsers = $this->Project->ProjectsUser->find('all', $projectsUsersDepartments);

这是它产生的SQL:

SELECT `ProjectsUser`.`id`, `ProjectsUser`.`user_id`, `ProjectsUser`.`project_id`, `ProjectsUser`.`status`, `User`.`id`, `User`.`contractor_id`, `User`.`group_id`, `User`.`title`, `User`.`last_name`, `User`.`first_name`, `User`.`email`, `User`.`main_phone`, `User`.`cell_phone`, `User`.`fax`, `User`.`address`, `User`.`city`, `User`.`state`, `User`.`zipcode`, `User`.`username`, `User`.`password`, `User`.`is_active`, `User`.`is_verified`, `User`.`is_id_verified`, `User`.`last_login`, `User`.`last_password_change`, `User`.`created`, `User`.`modified` 
FROM `projects_users` AS `ProjectsUser` 
inner JOIN `users` AS `User` ON (`User`.`id` = `ProjectsUser`.`user_id`) 
inner JOIN `departments_users` AS `DepartmentsUser` ON (`DepartmentsUser`.`user_id` = `User`.`id`) 
LEFT JOIN `users` AS `User` ON (`ProjectsUser`.`user_id` = `User`.`id`)  
WHERE `ProjectsUser`.`project_id` = 1 AND `DepartmentsUser`.`department_id` = 25 

我无法理解为什么联接会抛出这条线:

LEFT JOIN `users` AS `User` ON (`ProjectsUser`.`user_id` = `User`.`id`)  

导致SQL Error: 1066: Not unique table/alias: 'User'错误,因为用户被定义了两次。

我不知道我是如何告诉连接声明这样做的。在我对蛋糕连接的理解中,我是否缺少某些东西?谢谢!

1 个答案:

答案 0 :(得分:1)

在您的AppModel中设置public $recursive = -1;是一种良好的做法 - 这样,您的发现就会在您不知情的情况下自动添加内容。

"递归"这是一个不错的主意,但绝不应该在实践中使用,这就是为什么它在Cake 3中被完全删除了。

在这种情况下,递归大于-1可能是您的问题。