现象: 现有一个类LeaveModel继承自model,在LeaveModel中使用create方法写数据库,要写入的values没有写进数据库,但是数据库记录增加了一条,只是所有列的值都是default值而非所设置的values。 建表语句:
$model = new LeaveModel();
$model->create($values);
原因: 在LeaveModel中有自定义的构造函数,构造函数中应该传递参数attribute,若不传递attribute则在写sql时无法调到要写入的数据,而只能以默认值null来写数据库。 create函数的原型如下(是在model类中定义的):
public static function create(array $attributes = [])
{
$model = new static($attributes);
$model->save();
return $model;
}
上面调用了一个特殊的函数 new static
,它的意思和new self不同,new self是新建并初始化类对象,该类为当前代码所在类的那个类;而new
static也是新建并初始化类对象,但是该类是当前所实例化的那个类。放到这个create函数里也就是新建并初始化$model为LeaveModel类(调用create的对象的类类型)对象,因此在实例化时所传递的$attributes参数也就是LeaveModel的构造函数中所传递的参数而非create函数本身的形参,故前面虽然在调用create时传递了values,但是在实际写sql时却没用到。
解决方法: 将LeaveModel原来的构造函数改为,添加参数$attribute,并调用父类的构造函数
public function __construct(array $attribute=[]){
parent::_construct($attribute);
……
}