ORM 的批量赋值方法 create () 新增一条数据 ,但是赋值无效 ,新增的记录都是默认值

下面是我的代码 ,通过 self::create() 方法新增一条记录

    /**
     * 不可批量赋值的属性。
     *
     * @var array
     */
    protected $guarded = array();

    /**
     * 新增数据
     * @param $data 新增的数据
     * @return mixed
     */
    public static function insert($data)
    {
        return self::create(['pid' => 3, 'name' => '什么鬼']);
    }

数据库结构是这个样子的

ORM 的批量赋值方法 create() 新增一条数据 ,但是赋值无效 ,新增的记录都是默认值
ORM 的批量赋值方法 create() 新增一条数据 ,但是赋值无效 ,新增的记录都是默认值

当我通过一个 http 请求调用这个 insert() 方法时 ,数据库中新增了一条记录
按照我的代码新的记录的 pid 字段值应该为 3,name 字段值应该为 "什么鬼"
但是新增的记录的字段值都是默认值( 建表时通过 DEFAULT 关键字指定的 )

ORM 的批量赋值方法 create() 新增一条数据 ,但是赋值无效 ,新增的记录都是默认值

检查了很久 ,不知道什么原因 ,有遇到过相同情况的小伙伴吗?

这是我的建表语句

-- 管理员菜单表
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'];

但是插入的新数据依然是默认值 ,没有解决这个问题

附言 1  ·  4年前

我我我

附言 2  ·  4年前

我对我的代码再次做出修改 ,解决了我的问题

    /**
     * 新增数据
     * @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() 会出现问题 ,如果有知道的小伙伴可以分享出来 ,供大家以后参考

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 19

使用 create 方法创建,得在模型中声明可批量赋值的字段

protected $fillable = ['name', 'pid'];

然后再使用 create 即可

4年前 评论
cangsongbayu (楼主) 4年前

楼上说的不对,批量赋值可以设白名单或者黑名单,create()方法返回模型实例,打印看看属性。

4年前 评论
yanthink 4年前
qf-Z (作者) 4年前
qf-Z (作者) 4年前
qf-Z (作者) 4年前
cangsongbayu (楼主) 4年前
cangsongbayu (楼主) 4年前
cangsongbayu (楼主) 4年前
cangsongbayu (楼主) 4年前

时间自动维护 false ,怎么还会自动维护 create_time 呢,你确定这些数据是你掉 insert 插入的?,看看有没有进去 insert 方法

4年前 评论
cangsongbayu (楼主) 4年前

构造方法换成如下写法即可生效

public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
    }
3年前 评论

解决了吗 我的出现了同样的问题

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!