删除主ID以外的字段

时间:2009-08-20 06:02:53

标签: jquery cakephp

我正在尝试从我的表中删除与特定id对应的条目列表。我得到id并通过ajax函数将其发布到控制器并使用模型的Delete函数删除特定条目。但条目不会被删除。

这是我在视图文件中的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']);
}

我想要删除条目的表是“结果”。一些人帮助我如何删除条目。

修改

现在我正在使用delete sql查询来删除Results表中的条目。

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

我不知道为什么CakePHP的删除命令不起作用。

但现在的问题是,只有当我刷新页面时,才会反映出条目的删除。如果我不刷新,条目仍会显示在表格中。 也许如果CakePHP的删除功能工作,页面将刷新。

deleteAll方法有效,因为我没有像deceze所指出的那样将主要id作为delete方法的输入。

$ this->结果 - > deleteAll(array('Result.form_id'=> $ this-> data ['Result'] ['form_id']));

关于反映删除条目的问题,我在Xr建议的时候做了$(“。entries).remove()成功,因此删除条目表而不必刷新页面。

4 个答案:

答案 0 :(得分:5)

"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 25删除id,它不知道您要基于不同的标准删除,也不关心。

您正在寻找的是Model::deleteAll()

  

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

     

与del()和remove()相同,但deleteAll()删除与提供的条件匹配的所有记录。 $ conditions数组应该作为SQL片段或数组提供。

你应该可以用它做这样的事情:

$this->Result->deleteAll(array('Result.form_id' => $this->data['Result']['form_id']));

答案 1 :(得分:1)

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

不应该是

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

我看起来没多远,但$ data看起来不像在deleteEntries()中定义。

答案 2 :(得分:0)

function deleteEntries()    {

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

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

}

答案 3 :(得分:0)

你的第二个问题可能最好放在一个单独的问题中,但这里是:

正如之前所指出的那样,表格不会因为您的数据库发生变化而神奇地改变。您必须刷新页面或通过Javascript删除已删除的条目。

首先,您的Controller方法应该返回删除是否成功。你可以这么做:

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

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

要成为正确的MVC,你应该在View中返回这个值,最好是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();
            }
        }
    }
}