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
相关产品推荐
相关产品推荐

