ORM 的批量赋值方法 create () 新增一条数据 ,但是赋值无效 ,新增的记录都是默认值
下面是我的代码 ,通过 self::create() 方法新增一条记录
/**
* 不可批量赋值的属性。
*
* @var array
*/
protected $guarded = array();
/**
* 新增数据
* @param $data 新增的数据
* @return mixed
*/
public static function insert($data)
{
return self::create(['pid' => 3, 'name' => '什么鬼']);
}
数据库结构是这个样子的
当我通过一个 http 请求调用这个 insert() 方法时 ,数据库中新增了一条记录
按照我的代码新的记录的 pid 字段值应该为 3,name 字段值应该为 "什么鬼"
但是新增的记录的字段值都是默认值( 建表时通过 DEFAULT 关键字指定的 )
检查了很久 ,不知道什么原因 ,有遇到过相同情况的小伙伴吗?
这是我的建表语句
-- 管理员菜单表
DROP TABLE IF EXISTS `sys_admin_menu`;
CREATE TABLE `sys_admin_menu`(
`id` INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(84) DEFAULT '未命名' COMMENT '菜单名称',
`icon` VARCHAR(84) DEFAULT '' COMMENT '菜单图标',
`url` VARCHAR(84) DEFAULT 'javascript:;' COMMENT '访问的路由地址',
`order` INT(11) DEFAULT 0 COMMENT '排序',
`pid` INT(11) UNSIGNED DEFAULT 0 COMMENT '上级菜单 id',
`is_expand` TINYINT(3) DEFAULT 0 COMMENT '是否默认展开 :0=不展开 1=展开',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '菜单的创建时间'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='管理员菜单表';
这是我模型类的完整代码
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class AdminMenuModel extends Model
{
/**
* 与模型关联的表名
*
* @var string
*/
protected $table = 'admin_menu';
/**
* 重定义主键
*
* @var string
*/
protected $primaryKey = 'id';
/**
* 指示模型主键是否递增
*
* @var bool
*/
public $incrementing = true;
/**
* 指示是否自动维护时间戳
*
* @var bool
*/
public $timestamps = false;
/**
* 模型日期列的存储格式。
*
* @var string
*/
protected $dateFormat = 'Y-m-d H:i:s';
/**
* 日期列名称
*/
const CREATED_AT = 'create_time';
const UPDATED_AT = 'update_time';
/**
* 模型的默认属性值。
*
* @var array
*/
// protected $attributes = [
//
// ];
/**
* 不可批量赋值的属性。
*
* @var array
*/
protected $guarded = array();
public function __construct()
{
}
/**
* 返回所有的管理员菜单
* @param bool $tree 是否将菜单列表转为树结构返回
* @return array
*/
public static function get_all($tree = true)
{
$select = array(
'id',
'name as title',
'name',
'icon',
'url',
'order',
'pid',
'create_time',
'is_expand'
);
$result = self::select($select)->get()->toArray();
return $tree ? list_to_tree($result) : $result;
}
/**
* 更新数据
* @param $id
* @param $data
* @return mixed
*/
public static function edit($id, $data)
{
return self::where('id', $id)->update($data);
}
/**
* 新增数据
* @param $data 新增的数据
* @return mixed
*/
public static function insert($data)
{
return self::create(['pid' => 3, 'name' => '什么鬼']);
}
}
我修改了我的代码 ,打印了 self::create() 方法的返回值
public static function insert($data)
{
$res = self::create(['pid' => 3, 'name' => '什么鬼']);
var_dump($res);
}
以下是打印的结果 ,但是我不能从打印结果中分析出问题原因 ,放在这里供大家参考
object(App\Model\AdminMenuModel)#257 (26) {
["table":protected]=>
string(10) "admin_menu"
["primaryKey":protected]=>
string(2) "id"
["incrementing"]=>
bool(true)
["timestamps"]=>
bool(false)
["dateFormat":protected]=>
string(11) "Y-m-d H:i:s"
["guarded":protected]=>
array(0) {
}
["connection":protected]=>
string(5) "mysql"
["keyType":protected]=>
string(3) "int"
["with":protected]=>
array(0) {
}
["withCount":protected]=>
array(0) {
}
["perPage":protected]=>
int(15)
["exists"]=>
bool(true)
["wasRecentlyCreated"]=>
bool(true)
["attributes":protected]=>
array(1) {
["id"]=>
int(49)
}
["original":protected]=>
array(1) {
["id"]=>
int(49)
}
["changes":protected]=>
array(0) {
}
["casts":protected]=>
array(0) {
}
["dates":protected]=>
array(0) {
}
["appends":protected]=>
array(0) {
}
["dispatchesEvents":protected]=>
array(0) {
}
["observables":protected]=>
array(0) {
}
["relations":protected]=>
array(0) {
}
["touches":protected]=>
array(0) {
}
["hidden":protected]=>
array(0) {
}
["visible":protected]=>
array(0) {
}
["fillable":protected]=>
array(0) {
}
}
我对我代码做出了新的修改 ,使用了白名单 ,修改如下 。
/**
* 不可批量赋值的属性。
*
* @var array
*/
// protected $guarded = [];
/**
* 可以被批量赋值的属性。
*
* @var array
*/
protected $fillable = ['name', 'pid'];
但是插入的新数据依然是默认值 ,没有解决这个问题
我我我
我对我的代码再次做出修改 ,解决了我的问题
/**
* 新增数据
* @param $data 新增的数据
* @return mixed
*/
public function insert($data)
{
$this->pid = 3;
$this->name = '什么鬼';
$res = $this->save();
// $res = self::create(['pid' => 3, 'name' => '什么鬼']);
dd($res);
}
数据插入成功了 ,字段的值也是我设置的值
但是没有采用 static 方法 ,因此在控制器中调用模型时不能静态调用
虽然问题解决了 ,我还是很好奇为什么 create() 会出现问题 ,如果有知道的小伙伴可以分享出来 ,供大家以后参考
使用 create 方法创建,得在模型中声明可批量赋值的字段
然后再使用 create 即可
楼上说的不对,批量赋值可以设白名单或者黑名单,
create()
方法返回模型实例,打印看看属性。时间自动维护
false
,怎么还会自动维护create_time
呢,你确定这些数据是你掉insert
插入的?,看看有没有进去insert
方法构造方法换成如下写法即可生效
解决了吗 我的出现了同样的问题