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 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 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年前 评论

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