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;
}