hyperf

hyperf实例化模型后保存变修改的问题

09-19 15:31

在控制器的构造中实例化模型,运行hyeprf后,向数据库中添加数据,控制器如下:

use App\Model\Field;

#[AutoController]

class FieldController extends AbstractController {

public function __construct()

$this->field = new Field;

}

public function save(RequestInterface $request) {

$data = $request->post();

//保存

if($this->field->saveFieldData($data, $this->Message))$this->Status=-1;

return $this->finish();

}

}

如上面代码所示,在构造函数中就已经实例化field模型,保存通过field模型的saveFieldData方法执行。

这种方法在连接后进行的第一次保存是正常的,同一个连接的第二次保存即变成修改,每次操作都会修改首次新增的那条数据,通过Db::getQueryLog()打印最后一次执行sql,也可以看出最后确实执行了update语句。


这种情况hyperf文档并未提及,模型的所有操作大都站在控制器的角度,但将保存动作提前到控制器中,问题依旧,所以只能通过其它方式解决。

由于hyperf通过swoole常驻内存,所以大概可以考虑在框架启动时,构造函数中的实例化动作已经执行,所以不妨在每次新增时都再次实例化模型。

public function save(RequestInterface $request) {

$data = $request->post();

//保存

$this->field = new Field; //重新实例化

if($this->field->saveFieldData($data, $this->Message))$this->Status=-1;

return $this->finish();

}

这样做确实解决了问题,但违背了常驻内存的意义,更像是多年前fpm的写法,所以不推荐。


在查看文档时,发现了批量添加的create方法,于是做测试,可以解决上面的问题,注意使用此方法时要通过protected array $fillable声明可以批量操作的字段。

protected array $fillable = ['name','type','field','placeholder','listorder'];

public function saveFieldData($input, &$message):Int{

$this->create($input);

return 0;

}


微信小程序
大潇博客 版权所有 Copyright ©2016~2026
京ICP备17004217号-6  合作QQ:284710375
天玺科技