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 为您提供了一对名为 toArray
和 toRawArray
的方法:
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
会捕捉到它。
我正在使用 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 为您提供了一对名为 toArray
和 toRawArray
的方法:
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
会捕捉到它。