【问题标题】:How to delete a sub record based on criteria in Cakephp?如何根据 Cakephp 中的条件删除子记录?
【发布时间】:2016-10-20 14:17:37
【问题描述】:

我在模型中通过 hasMany 链接了 2 个表“主题”和“帖子”

我想删除 id = 3 的 Post 条目,因为它没有消息。

在“Post”表的模型中,我有这个“beforeSave”:

public function beforeSave($options = array()) {

  if ($this->data['Post']['message'] == '') {
    CODE TO DELETE HERE
  }
}

这是我的 $this->request->data :

Array
(
[Topic] => Array
(
    [id] => 1
    [topic_title] => This is my topic
)

[Post] => Array
(
    [1] => Array
        (
            [id] => 1
            [title] => Blah
            [message] => My message
        )

    [2] => Array
        (
            [id] => 2
            [title] => Second Blah
            [message] => Second My message
        )
    [3] => Array
        (
            [id] => 3
            [title] => Second Blah
            [message] => 
        )
    )
)

我不知道如何在模型中删除或者这是错误的方法?

我现在也在 saveAssociated 之前在控制器中尝试过这个:

$this->loadmodel('Post');

foreach ($this->request->data['Post'] as $i => $post) {

 if ($post['message'] == '') {
     unset($this->request->data['Post'][$i]);

     $options = array( 'conditions' => array( 'Post.id' => $i) );
     $this->Post->find('first', $options);

     if ($this->Post->delete()) {
      echo "Post id : " . $i . ' - Deleted';
    } else {
      echo "Post id : " . $i . ' - Not deleted';
    }
 }

}

这给了我“Post id xxx Deleted”,但是 Post 记录没有被删除。

【问题讨论】:

    标签: cakephp cakephp-2.0 cakephp-2.3 cakephp-2.1


    【解决方案1】:

    如果消息为空,您可以取消设置 beforeSave 中的数据,如下所示:

    public function beforeSave($options = array()) {
    
        foreach ($this->data['Post'] as $i => $post) {
            if ($post['message'] == '') {
                unset($this-data['Post'][$i]);
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复,但恐怕这行不通。 [代码] if ($this->data['Post']['message'] == '') { unset($this->data['Post']); }
    • 我无法编辑我的最后一条评论,所以我必须在此处添加。我不理解您为 Post 模型编写的代码,因为我不应该遍历模型中的每个 Post。无论如何,每个帖子都会调用它。
    • 它不会遍历模型中的每个帖子。 beforeSave 中的$this->data 表示即将保存的数据。所以这里的想法是,您将在保存之前删除带有空消息的帖子。一个更好的主意可能是只添加一些模型验证,要求消息字段不为空。 book.cakephp.org/2.0/en/models/data-validation.html
    • 我这样展示是因为它更容易理解。在表单上,​​它们实际上是一些 javascript 操作,因此我需要删除模型或控制器中的帖子。但是,您的代码在 Post 模型中不起作用。 “我得到非法字符串偏移‘消息’”
    【解决方案2】:

    由于我使用的是“saveAssociated”,因此我还必须“取消设置”“$this->request->data”中的帖子,否则它将再次被保存。

    $this->loadmodel('Post');
    
    foreach ($this->request->data['Post'] as $i => $post) {
    
     if ($post['message'] == '') {
       unset($this->request->data['Post'][$i]);
    
     if ($this->Post->delete($post['id'], false)) {
      echo "Post id : " . $i . ' - Deleted';
     } else {
      echo "Post id : " . $i . ' - Not deleted';
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多