You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter4中hasChanged()值相同却返回true的原因咨询

CodeIgniter4 Entity hasChanged 返回1的原因

你遇到的问题核心是CodeIgniter4的Entity跟踪的是当前实例自身的原始值,而非你单独从数据库取出的另一个实例的值。

具体原因:

  • 你通过new \App\Entities\SknowedWinterSportsEntity();创建的是一个空的Entity实例,此时sknowedWinterSports_id的原始值为null(未初始化状态)。
  • 当你执行$entity->sknowedWinterSports_id = $feature['id'];时,当前值变为relation/5466186,和原始的null形成差异,所以hasChanged()会返回1(true)。
  • 你从数据库取出的$original是另一个独立的Entity实例,它的状态和当前的$entity没有关联,所以两者属性值相同不影响$entity的变更判断。

正确的写法(如果要基于数据库原始值判断变更):

如果你想对比数据库中的原始值,应该直接从模型加载Entity实例,再尝试修改后判断:

$feature['id'] = 'relation/5466186';
// 直接从数据库加载Entity,此时已初始化原始值
$entity = $this->SknowedWinterSportsModel->find($feature['id']);        

echo 'Entity Value: '.$entity->sknowedWinterSports_id.'<br>';
echo 'Original Value: '.$entity->getOriginal('sknowedWinterSports_id').'<br>';

// 这里如果没有修改属性,hasChanged会返回0
echo $entity->hasChanged('sknowedWinterSports_id');    

如果需要基于现有Entity实例初始化新实例的原始值,可以用fill()或者setOriginal()方法:

$feature['id'] = 'relation/5466186';
$original = $this->SknowedWinterSportsModel->find($feature['id']);

$entity = new \App\Entities\SknowedWinterSportsEntity();
// 将原始实例的数据填充到新实例,并设置原始值
$entity->fill($original->toArray());
$entity->setOriginal($original->toArray());

// 此时再赋值相同的id,hasChanged会返回0
$entity->sknowedWinterSports_id = $feature['id'];
echo $entity->hasChanged('sknowedWinterSports_id');    

内容的提问来源于stack exchange,提问作者spreaderman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:22:08