为什么我的 cake join 加入了 LEFT JOIN?
Why is my cake join throwing in a LEFT JOIN?
我正在处理两个 HABTM 关系的连接。
我有一个 table 命名的项目,它与用户 table 有 HABTM 关系。它使用中介 table projects_users 作为其 HABTM 关系。
然后用户 table 与部门有 HABTM 关系(使用 department_users table)。
这是我的加入声明(在我的 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'
错误,因为用户被定义了两次。
我不明白我是如何告诉连接语句这样做的。在我对蛋糕连接的理解中是否缺少某些东西?谢谢!
在您的 AppModel 中设置 public $recursive = -1;
被认为是一种很好的做法 - 这样,您的发现将不会在您不知情的情况下自动添加内容。
"Recursive" 是个好主意,但在实践中永远不应该真正使用,这就是为什么它在 Cake 3 中被完全删除的原因。
在这种情况下,递归大于 -1 可能是您的问题。
我正在处理两个 HABTM 关系的连接。
我有一个 table 命名的项目,它与用户 table 有 HABTM 关系。它使用中介 table projects_users 作为其 HABTM 关系。
然后用户 table 与部门有 HABTM 关系(使用 department_users table)。 这是我的加入声明(在我的 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'
错误,因为用户被定义了两次。
我不明白我是如何告诉连接语句这样做的。在我对蛋糕连接的理解中是否缺少某些东西?谢谢!
在您的 AppModel 中设置 public $recursive = -1;
被认为是一种很好的做法 - 这样,您的发现将不会在您不知情的情况下自动添加内容。
"Recursive" 是个好主意,但在实践中永远不应该真正使用,这就是为什么它在 Cake 3 中被完全删除的原因。
在这种情况下,递归大于 -1 可能是您的问题。