【问题标题】:Deleting on a field other than the primary id在主 ID 以外的字段上删除
【发布时间】:2015-07-04 20:43:18
【问题描述】:

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

这是我在名为reports.ctp 的视图文件中的ajax 函数,在单击链接时我调用控制器函数。

$(".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']);
}

我要从中删除条目的表是“结果”。有人帮助我如何删除条目。

编辑

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

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

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

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

解决方案

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

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

关于反映条目删除的问题,我按照 Xr 的建议做了一个 $(".entries).remove() on success,因此条目表被删除而无需刷新页面。

【问题讨论】:

    标签: jquery cakephp


    【解决方案1】:
    "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() 删除带有id 25 的Result,它不知道您要根据不同的标准删除,也不在乎。

    你要找的是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']));
    

    【讨论】:

    • 好吧,我昨天确实尝试过 deleteAll.. 但没有删除条目。我会再试一次。
    • 是的,deleteAll 工作得很好。之前我已经给出了 array('conditions'=>array('Result.form_id' => $this->data['Result']['form_id' ]))..这就是为什么它没有删除我想的条目..谢谢..
    【解决方案2】:
    $this->Report->delEntries($data);
    

    不应该这样

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

    我并没有看更多,但 $data 看起来不像是在 deleteEntries() 中定义的。

    【讨论】:

    • 是的,我将其更改为 $this->data。但它仍然不起作用。我没有得到模型中的数据。
    • 那么,如果 $this->params['form']['formid'] 具有正确的值(我假设 Javascript 变量 'formid' 已定义,但您的代码没有提及它),我不知道为什么数据没有传递给模型。作为旁注,除非您实际上有比您在此处粘贴的更多的逻辑,否则您也可以运行 $this->Report->Result->delete($this->params['form']['formid'] ) 直接来自 ReportsController。
    • @Xr:模型中没有删除命令的具体原因。只是想也许删除命令只在模型中有效。现在我已经按照你所说的进行了更改,仍然没有删除条目。
    • 关于您的第二个问题,即表中缺少刷新的问题,这是非常合乎逻辑的,因为没有完整的页面重新加载(CakePHP 在这里无关紧要)。所以浏览器不知道应该删除该行。在您的成功处理程序中,添加类似 $(this).remove() 的内容。根据您的代码,您可能必须删除单击元素的父元素而不是元素本身。使用 $(this).parent() 或 $this.parents()。这样,在成功时,您将删除该行(您无需重新加载任何内容,只是假装您已完成)。
    • @Xr:你的建议很有效。我在成功时做了 $(".entries").remove() ,其中条目是保存表格的类。现在表格在没有刷新页面的情况下被删除..谢谢..
    【解决方案3】:

    函数 deleteEntries() {

         App::import('Sanitize');
         $post = Sanitize::clean($_POST);
    
         //very important to set cascade to false
         $this->Result->delete($post['form_id'],false);
    

    }

    【讨论】:

    • 仅当您不希望它级联时才重要,而不是经验法则。
    【解决方案4】:

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

    如前所述,表不会因为您的数据库发生变化而神奇地发生变化。您必须刷新页面或通过 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();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 2021-11-01
      • 2014-04-24
      • 2020-02-22
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多