0

0

laravel的fill方法怎么用

WBOY

WBOY

发布时间:2022-06-06 15:33:23

|

4138人浏览过

|

来源于php中文网

原创

在laravel中,fill方法是一个给Eloquent实例赋值属性的方法,该方法可以理解为用于过滤前端传输过来的与模型中对应的多余字段;当调用该方法时,会先去检测当前Model的状态,根据fillable数组的设置,Model会处于不同的状态。

laravel的fill方法怎么用

本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。

laravel的fill方法怎么用

fill 方法是一个给 Eloquent 实例赋值属性的方法,

让咱们点开 fill 方法先看一看它的源码:数组

这里笔者所使用的版本为 Laravel 5.5最新版,为了方便阅读,删除掉了注释框架

public function fill(array $attributes)
{
    $totallyGuarded = $this->totallyGuarded();
    foreach ($this->fillableFromArray($attributes) as $key => $value) {
        $key = $this->removeTableFromKey($key);
        if ($this->isFillable($key)) {
            $this->setAttribute($key, $value);
        } elseif ($totallyGuarded) {
            throw new MassAssignmentException($key);
        }
    }
    return $this;
}

首先能够看到,Laravel 会先去调用一个自身的 totallyGuarded 方法,让咱们点开这个方法:函数

public function totallyGuarded()
{
   return count($this->getFillable()) == 0 && $this->getGuarded() == ['*'];
}

能够看到这个方法的做用就是去获取自身的 fillable 与 guarded,而后判断他们是否都为 不可批量赋值 状态,最后返回一个布尔值this

// 返回一个 True or False 的布尔值
// 若是未设置 fillable 与 guarded,则会返回 True (注意,在这种状况下,此 `Model` 是不容许批量赋值任何属性的哦)
// 反之则返回 False
$totallyGuarded = $this->totallyGuarded();

Ok,让咱们回到刚才的 fill 方法继续往下看设计

接下来是一个 foreach 循环,可是在循环以前,Laravel 对传入的赋值属性执行了 fillableFromArray 这个方法,再点进去看一下,code

protected function fillableFromArray(array $attributes)
{
    if (count($this->getFillable()) > 0 && ! static::$unguarded) {
        return array_intersect_key($attributes, array_flip($this->getFillable()));
    }
    return $attributes;
}

此方法会检测你是否在 fillable 数组中定义了值,若是定义了值,则会返回 fillable 与 attributes 相交的值,若是没有,则返回 attributes 自身事件

而后回到 fill ,在调用 fillableFromArray 对参数进行处理以后,如今返回的值只剩咱们容许批量赋值的属性了 (若是你定义了)ip

循环第一行,先使用 removeTableFromKey 对参数的 Key 进行处理,删除键中的表名,此方法就不作过多讲解,只是一个字符串拆分取值的函数rem

$key = $this->removeTableFromKey($key);

接着往下看,Laravel对将要进行填充的每一个属性都调用了 isFillable 方法来确保此属性是能够被填充的,让咱们看一看它的源码:

public function isFillable($key)
{
   if (static::$unguarded) {
       return true;
   }
   if (in_array($key, $this->getFillable())) {
       return true;
   }
   if ($this->isGuarded($key)) {
       return false;
   }
   return empty($this->getFillable()) &&
       ! Str::startsWith($key, '_');
}

能够看到,在此方法中 Laravel 先判断了此 Model 是否禁用了守卫 (guarded),若是此 Model 并未启用守卫,那么直接返回 True

if (static::$unguarded) {
    return true;
}

若是启用了守卫,那么会判断一下此属性是否存在于 fillable 数组中,若是存在,则返回 True,

if (in_array($key, $this->getFillable())) {
    return true;
}

若是此属性不存在于 fillable 数组中,那么 Laravel 会再次判断此属性是否存在于 guarded 数组中,若是存在于此数组中,那么此属性就不是一个能够被批量赋值的属性,那么就会直接返回 False

家电小商城网站源码1.0
家电小商城网站源码1.0

家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l

下载
if ($this->isGuarded($key)) {
    return false;
}

若是以上都不符合,那么 Laravel 在最后会判断一下自身的 fillable 数组是为空而且此属性是以 _ 开头,而后返回一个布尔值

return empty($this->getFillable()) && ! Str::startsWith($key, '_');

而后回到 fill 方法接着看,若是此属性经过了 isFillable 方法的过滤,那么将此属性赋值给自身 (由于时间有限,setAttribute 这个方法就不细讲啦~),

$this->setAttribute($key, $value);

若是没有经过 isFillable 方法的过滤,那么 Laravel 会判断一下自身 Model 是否处于不限制任何属性批量赋值的状态,若是不是,那么 Laravel 会直接抛出一个 Exception

// 判断此属性是否经过了检测
if ($this->isFillable($key)) {
    // 将此属性赋值给自身
    $this->setAttribute($key, $value);
// 若是没有经过检测,那么判断一下自身 `Model` 是否为所有不可批量赋值状态,若是是,那么会抛出一个 `Exception`
} elseif ($totallyGuarded) {
    throw new MassAssignmentException($key);
}

在对全部的属性进行检测而且赋值后, Laravel 会将自身返回

return $this;

解析完毕,以上就是 fill 方法的源码啦~,最后来一个小结

在你调用 fill 方法的时候,Laravel 首先就会去检测当前 Model 的状态,

当你设置了 fillable 数组,没有设置 guarded 数组时,那么此 Model 会处于 仅可批量赋值指定属性 的状态

当你没有设置 fillable 数组,却设置了 guarded 数组时,那么此 Model 会处于 可批量赋值任何属性 的状态

至于你同时设置了 fillable 与 guarded 数组的状况就不去讨论了,由于这样作自己就是被 Laravel 所禁止的

而后调用 fillableFromArray 去获取 attributes 与 fillable 数组的交集,若是你没有定义 fillable 或者禁用掉了守卫,那么此方法会直接返回 attributes

而后 Laravel 会对返回的数组作一个循环,在这个循环中 Laravel 会对每个属性调用 isFillable 方法检测这个属性是否能够被填充,若是没有经过此方法的检测(不存在于fillable 数组中而且没有设置 guarded 数组或存在于 guarded 数组中),那么 Laravel会检测当前 Model 是否处于 仅可批量赋值指定属性 状态,若是是,那么会直接抛出一个 Exception

而后 Laravel 会返回完成赋值操做后的 $this

【相关推荐:laravel视频教程

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号