【问题标题】:Incorrect behavior of delete() methoddelete() 方法的不正确行为
【发布时间】:2010-12-15 14:56:48
【问题描述】:

我有三个模型: 项目, 用户, 项目用户。 ProjectsUser 表用于 Project 和 用户。 这是 Project 模型的 remove() 方法:

    function remove($project_id, $user_id) 
    { 
        /* 
         * Проверяем, относится ли выбранный проект к пользователю 
         */ 
//        $data = $this->read('', $project_id); 
// 
//        if($data['User'][0]['id'] != $user_id) 
//        { 
//            return false; 
//        } 
        /* 
         * Если проект принадлежит пользователю, то удалить его 
         */ 
        $result = $this->delete($project_id); 
        if(!$result) 
        { 
            return false; 
        } 
        return true; 
    } 

以及Projects控制器的remove()方法:

        function remove($project_id) 
        { 
            /* 
             * Пробуем удалить проект 
             */ 
            $user_id = $this->Session->read('Auth.User.id'); 
            $result = $this->Project->remove($project_id, $user_id); 
            /* 
             * Если возникли ошибки, то отправить их в буфер сообщений 
о результате операций 
             */ 
            if(!$result) 
            { 
                $this->Session->setFlash('Возникли проблемы при 
удалении проекта, попробуйте позже'); 
                $this->redirect(array( 
                    'controller' => 'projects', 
                    'action' => 'index', 
                )); 
            } 
            $this->Session->setFlash('Проект успешно удален'); 
//            $this->redirect(array( 
//                'controller' => 'projects', 
//                'action' => 'index', 
//            )); 
        } 

所以,在调试时,我发现 Cake 对 delete() 进行了两次查询 方法:通过project_id从projects表中删除project 下一个: 从projects_users 删除projects_users.user_id = 4 这意味着如果用户有两个项目,那么在查询所有关系之后 在 project_users 表中的 user_id 将被删除。 我该如何解决这个问题以及为什么 Cake 按 user_id 从 projects_users 中删除 不是按 project_id 吗?

【问题讨论】:

  • 能否贴出用户和项目的模型关联代码。
  • 请使用return $this->delete($project_id); 而不是您那里的冗余6行结构。 :)

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


【解决方案1】:

默认情况下,CakePHP 级联它的删除,这意味着它将尝试删除与您尝试删除的记录相关的所有数据。

要防止这种行为,请将 Product 模型中的行更改为:

$result = $this->delete($project_id, false);

另外,正如@deceze 所提到的, $this->delete() 将根据删除的成功返回真/假,所以让你的整个函数是安全的:

function remove($project_id, $user_id)
{ 
    // do any checks for $user_id here...
    // ...
    $result = $this->delete($project_id, false);
    return $result;
}

这里有关于 delete() 的更多信息:http://book.cakephp.org/view/1036/delete

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多