Неверное поведение метода delete () - PullRequest
0 голосов
/ 15 декабря 2010

У меня три модели: Проект, Пользователь, ProjectsUser. Таблица ProjectsUser используется для отношений HABTM между Project и Пользователь. Это метод remove () модели Project:

    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; 
    } 

И метод remove () контроллера Projects:

        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 делает два запроса на удаление () метод: удаление проекта по project_id из таблицы проектов и следующий: УДАЛИТЬ ИЗ projects_users ГДЕ projects_users. user_id = 4 Это означает, что если у пользователя есть два проекта, то после запроса все отношения в проекте projects_users для user_id будет удалена. Как я могу это исправить и почему Cake удаляет из projects_users по user_id не по project_id?

1 Ответ

1 голос
/ 28 марта 2011

CakePHP каскадно удаляет по умолчанию, что означает, что он попытается удалить все связанные данные в записи, которую вы пытаетесь удалить.

Чтобы предотвратить это, измените строку в модели продукта на:

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

Кроме того, как уже упоминалось @deceze, $ this-> delete () будет возвращать true / false в зависимости от успешности удаления, поэтому можно использовать целую функцию:

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

Больше информации об удалении () здесь: http://book.cakephp.org/view/1036/delete

...