Codeigniter 4 hasChanged() - 我原以为没有变化但是 hasChanged() returns 是的,它已经改变了

Codeigniter 4 hasChanged() - I was expecting no change but hasChanged() returns true, it has changed

我正在使用 Codeigniter 4 验证表单。提交后,我首先检查是否有任何要更新的内容。如果没有要更新的内容,则会出现警告消息,指出没有要更新的内容。问题是,除了 hasChanged returns TRUE 声明它确实已经改变之外,我没有改变任何东西。有什么简单的方法可以反映出发生了什么变化吗?这是我的代码;

public function post_update($post_id)
{
    $original_post = $this->model->find($post_id);
    if ($this->request->getMethod() === 'post') {
        // get the form data
        $update_post = $this->request->getPost();
  
        $original_post->fill($update_post);
        if (!$original_post->hasChanged()){
            return redirect()->back()
                             ->with('warning', 'Nothing to Update')
                             ->withInput();
        } else {
           $this->model->save($update_post)
    }

} // end method

我在填充前和填充后都回显了 $original_post。发送的字段不同,但据我所知,发送的内容没有改变。想知道 hasChanged() 似乎发生了什么变化。

此外,我在 if (!$original_post->hasChanged() 之前添加了以下内容以查看发生了什么变化:

            echo 'post_id'.$original_post->hasChanged('post_id');echo '</br>';
        echo 'post_category_id'.$original_post->hasChanged('post_category_id');echo '</br>';
        echo 'post_user_id'.$original_post->hasChanged('post_user_id');echo '</br>';
        echo 'post_title'.$original_post->hasChanged('post_title');echo '</br>';
        echo 'post_slug'.$original_post->hasChanged('post_slug');echo '</br>';
        echo 'post_body'.$original_post->hasChanged('post_body');echo '</br>';
        echo 'post_is_publish'.$original_post->hasChanged('post_is_publish');echo '</br>';
        echo 'post_image'.$original_post->hasChanged('post_image');echo '</br>';
        echo 'post_created_at'.$original_post->hasChanged('post_created_at');echo '</br>';
        echo 'post_updated_at'.$original_post->hasChanged('post_updated_at');echo '</br>';
        echo $original_post->hasChanged();

在上面,它 returns 为空(意思是 false,意思是没有变化)除了 echo $original_post->hasChanged(); 之外的所有内容,返回 1 表示它已经改变。我怎样才能找出发生了什么变化???我的 table.

中没有更多字段

How can I find out what changed???

实体 class 为您提供了一对名为 toArraytoRawArray 的方法:

public function toArray(bool $onlyChanged = false, bool $cast = true, bool $recursive = false): array

public function toRawArray(bool $onlyChanged = false, bool $recursive = false): array

您可以使用第一个布尔参数来仅获取实体认为已更改的内容。如果您使用实体魔法执行任何隐式转换,您可以使用原始版本绕过它们。

我会说 hasChanged 使用严格的比较,这让很多人(包括我自己)在第一次使用它时措手不及;您需要注意不要更改数据类型(例如,将整数 1 更改为字符串“1”),因为 hasChanged 会捕捉到它。