从CakePHP中的连接表中删除

时间:2014-06-05 18:39:46

标签: php cakephp has-and-belongs-to-many cakephp-model

我遇到一个问题,我有表用户和团队,我的关系定义如下:

public $hasAndBelongsToMany = array(
    'Teams' => array(
        'className' => 'Team',
        'joinTable' => 'teams_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'team_id',
        'unique' => 'keepExisting',
        'order' => array('name' => 'ASC')
    )
);

现在的问题是,当我删除例如属于id为1的团队的用户时,来自具有id 1的teams_users的所有关联都会随之消失。在我的单元测试中,我发现删除查询并不真正关心user_id并删除了我的团队中的所有内容:(以下是自动查询:

DELETE `TeamsUser` 
FROM `enterpriseappstore_test`.`teams_users` AS `TeamsUser` 
WHERE `TeamsUser`.`team_id` = 1

这是负责在模型中删除用户的代码:

$ok = $this->delete((int)$userId, false);

如何仅删除特定用户的关联,而不是团队?所以,从UsersController,我需要删除一个用户和他与所有剩余团队的连接......现在无论出于何种原因,我正在删除用户和所有关联(来自teams_users的连接),其中team_id是相同的,而不是user_id

2 个答案:

答案 0 :(得分:0)

所以最后我不得不做手工SQL ......并不为此感到自豪,但它是迄今为止我找到的唯一解决方案。很高兴能够给出更好的解决方案:

$this->query('DELETE FROM `teams_users` WHERE `user_id` = '.(int)$userId.';');
$this->query('DELETE FROM `users` WHERE `id` = '.(int)$userId.';');

答案 1 :(得分:-1)

从控制器执行此操作:

$ok = $this->User->delete((int)$userId);

确保teams_usersusers表中的外键具有约束ON DELETE CASCADE,f.ex。:

ALTER TABLE teams_users 
    ADD CONSTRAINT fk_users_teams
    FOREIGN KEY(user_id)
    REFERENCES users(id)
    ON DELETE CASCADE;

http://www.mysqltutorial.org/mysql-on-delete-cascade/