Удаление в поле, отличном от основного идентификатора - PullRequest
2 голосов
/ 20 августа 2009

Я пытаюсь удалить список записей из моей таблицы, соответствующий определенному идентификатору. Я получаю идентификатор и отправляю его через функцию ajax на контроллер и использую функцию удаления модели, чтобы удалить конкретную запись. Но записи не удаляются.

Это моя функция ajax в файле представлений с именем reports.ctp, где я вызываю функцию контроллера при нажатии на ссылку.

$(".delete_entries").click(function() {
    $.ajax({
        type: "POST",
        url: "http://localhost/FormBuilder/reports/deleteEntries",
        data: "formid="+formid,
        async: false,
        success: function(msg){
            alert( "Data Saved: " + msg);
        }  
    });//ajax
});

Это действие удаления в reports_controller.php

function deleteEntries()
{
    $this->data['Result']['form_id']=$this->params['form']['formid'];
    $this->Report->Result->delete($this->data['Result']['form_id']);
}

Таблица, из которой я хочу удалить записи, называется «Результаты». кто-нибудь, помогите мне, как удалить записи.

EDIT

Теперь я использую запрос sql delete как таковой, чтобы удалить записи в таблице результатов.

$this->Result->query("delete from results where form_id=".$this->data['Result']['form_id']);

Я не знаю, почему команда удаления CakePHP не работает.

Но теперь проблема в том, что только когда я обновляю страницу, удаляются записи. Если я не обновлюсь, записи по-прежнему отображаются в таблице. Возможно, если работает функция удаления CakePHP, страница обновится.

РЕШЕНИЕ

Метод deleteAll работает, так как я не даю первичный идентификатор в качестве ввода для метода удаления, как указала deceze.

$ this-> Result-> deleteAll (массив ('Result.form_id' => $ this-> data ['Result'] ['form_id']));

Что касается проблемы отражения удаления записей, я выполнил $ (". Records) .remove () при успехе, как предложил Xr, поэтому таблица записей удаляется без обновления страницы.

Ответы [ 4 ]

5 голосов
/ 21 августа 2009
"delete from results where form_id=".$this->data['Result']['form_id']

Проблема в том, что вы хотите удалить поле, отличное от основного id. Метод Model::delete() ожидает, что вы зададите ему основное поле id.

Когда вы пытаетесь сделать

$this->Report->Result->delete($this->data['Result']['form_id']);

даже если вы сначала поместите form_id в красивый массив, результат будет следующим:

$this->Report->Result->delete(25);  // let's say 'form_id' is 25

Это говорит delete() удалить Result с id 25, он не знает, что вы хотите удалить на основе другого критерия, ни это заботится.

То, что вы ищете, это Model::deleteAll().

deleteAll(mixed $conditions, $cascade = true, $callbacks = false)

То же, что и с del () и remove (), за исключением того, что deleteAll () удаляет все записи, которые соответствуют предоставленным условиям. Массив $ condition должен быть представлен как фрагмент или массив SQL.

Вы должны быть в состоянии сделать что-то подобное с этим:

$this->Result->deleteAll(array('Result.form_id' => $this->data['Result']['form_id']));
1 голос
/ 20 августа 2009
$this->Report->delEntries($data);

Разве это не должно быть

$this->Report->delEntries($this->data);

Я не стал смотреть дальше, но $ data не выглядит так, как определено в deleteEntries ().

0 голосов
/ 21 августа 2009

Вашу вторую проблему лучше всего поставить в отдельный вопрос, но здесь говорится:

Как указывалось ранее, таблица не будет волшебным образом изменяться только потому, что изменилась ваша база данных. Вам придется обновить страницу или удалить удаленную запись с помощью Javascript.

Прежде всего, ваш метод Controller должен возвращать, было ли удаление успешным. Вы могли бы просто сделать:

function delete() {
    $this->layout = 'ajax';

    if ($this->Result->deleteAll(...)) {
        echo "success";
    } else {
        echo "failure";
    }
}

Чтобы быть правильным MVC, вы должны вернуть это значение в представлении, предпочтительно в формате JSON, но оно подойдет для упражнения.

Допустим, на вашем сайте есть таблица:

<table>
  <tr>
    <td>Id: 25</td><td>My result</td><td><a class="delete_entries">Delete Entries</a></td>
  <tr>
  ...
</table>

В вашем Javascript, который связан со ссылкой в ​​строке , ваш success обратный вызов будет выглядеть примерно так:

$(".delete_entries").click(function() {

    // save a reference to the link, "this" will be something else in the callback
    var deleteLink = this;

    $.ajax({
        ...
        success: function(data){
            if (data == "success") {
                // remove the row in which the link resides
                $(deleteLink).parents('tr').remove();
            }
        }
    }
}
0 голосов
/ 21 августа 2009

функция deleteEntries () {

     App::import('Sanitize');
     $post = Sanitize::clean($_POST);

     //very important to set cascade to false
     $this->Result->delete($post['form_id'],false);

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...