Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP中从联接表中删除_Php_Cakephp_Has And Belongs To Many_Cakephp Model - Fatal编程技术网

在CakePHP中从联接表中删除

在CakePHP中从联接表中删除,php,cakephp,has-and-belongs-to-many,cakephp-model,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',

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

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的团队用户的关联都会随之消失。在我的单元测试中,我发现delete查询实际上并不关心用户的id,而是删除我团队中的所有内容:(以下是自动查询:

DELETE `TeamsUser` 
FROM `enterpriseappstore_test`.`teams_users` AS `TeamsUser` 
WHERE `TeamsUser`.`team_id` = 1
这是负责删除模型中用户的代码:

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

如何仅删除特定用户的关联,而不是团队?因此,从UsersController中,我需要删除一个用户及其与所有剩余团队的连接…现在,无论出于何种原因,我正在删除团队id相同的用户和所有关联(来自团队用户的连接),而不是控制器中的用户id。请执行以下操作:

$ok = $this->User->delete((int)$userId);
确保
teams\u users
users
表的外键在删除级联时具有约束
,例如:

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

因此,最后我不得不使用手动SQL…我并不为此感到自豪,但这是迄今为止我找到的唯一解决方案。非常高兴授予更好的解决方案:

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

显示您的删除方法。$ok=$this->delete((int)$userId,false);您可以使用编辑方法代替delete方法,只需取消选择团队和用户之间的关联,但我需要实际删除用户…:(从UsersController,我需要删除一个用户及其与所有剩余团队的连接…现在无论出于何种原因,我正在删除用户和所有团队id相同而不是用户id的关联(来自团队用户的连接)…希望我没有说太多!)这并不是一个真正的答案,为什么会为该表创建删除
team\u id
而不是
user\u id
的SQL。虽然将完整性检查卸载到DB是一种很好的做法,但对DB没有任何好处。删除错误的记录是因为
$this->delete((int)$userId,false)
是从错误的位置调用的。这不是根据用户在主帖子中的评论。他声称是从
用户
模型内部调用的。@Ondrej,如果您使用InnoDb表,建议您将决定是否删除关联记录的责任转交给数据库。如果您使用MyIsam,请发布更多数据-通过
delete
调用生成的所有查询。如果它们包含在事务中,则发布整个事务。在实时数据库(或副本)上执行,但不要在测试数据库上执行。