我的编程空间,编程开发者的网络收藏夹
学习永远不晚

laravel的fill方法如何用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

laravel的fill方法如何用

今天小编给大家分享一下laravel的fill方法如何用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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

本文操作环境: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

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的fill方法如何用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

laravel的fill方法如何用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

laravel的fill方法如何用

今天小编给大家分享一下laravel的fill方法如何用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在laravel中,f
2023-06-30

laravel的chunk方法如何用

这篇文章主要介绍“laravel的chunk方法如何用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel的chunk方法如何用”文章能帮助大家解决问题。在laravel中,chunk()方
2023-06-30

laravel中的old方法如何用

这篇“laravel中的old方法如何用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“laravel中的old方法如何用”文
2023-06-29

ES6数组复制和填充方法之如何使用copyWithin()、fill()

本篇内容主要讲解“ES6数组复制和填充方法之如何使用copyWithin()、fill()”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES6数组复制和填充方法之如何使用copyWithin()
2023-06-25

laravel中asset()方法如何用

本文小编为大家详细介绍“laravel中asset()方法如何用”,内容详细,步骤清晰,细节处理妥当,希望这篇“laravel中asset()方法如何用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。laravel
2023-06-30

laravel中distinct方法如何用

本文小编为大家详细介绍“laravel中distinct方法如何用”,内容详细,步骤清晰,细节处理妥当,希望这篇“laravel中distinct方法如何用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在lara
2023-06-30

laravel中如何使用with方法

这篇文章主要为大家展示了“laravel中如何使用with方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“laravel中如何使用with方法”这篇文章吧。在laravel中,with()方法
2023-06-26

laravel中has方法如何使用

这篇文章主要介绍“laravel中has方法如何使用”,在日常操作中,相信很多人在laravel中has方法如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel中has方法如何使用”的疑惑有所
2023-06-22

Laravel中Tinker的使用方法

这篇文章将为大家详细讲解有关Laravel中Tinker的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Laravel Tinker 的使用Laravel Tinker 简介在原生 PHP 中,可
2023-06-15

js fill函数填充数组或对象的解决方法

这篇文章主要介绍了js fill函数填充数组或对象的问题及解决方法,本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-02-24

Laravel中10个实用的方法

这篇文章将为大家详细讲解有关Laravel中10个实用的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Laravel 中一些常用的用法1. 在 find 方法中指定属性User::find(1, [n
2023-06-14

laravel中的scope如何用

今天小编给大家分享一下laravel中的scope如何用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在laravel中,s
2023-07-02

Laravel的Tinker如何使用

这篇文章主要介绍“Laravel的Tinker如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel的Tinker如何使用”文章能帮助大家解决问题。Laravel Tinker 的使用
2023-07-04

laravel的redis使用方法有哪些

这篇文章主要介绍“laravel的redis使用方法有哪些”,在日常操作中,相信很多人在laravel的redis使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel的redis使用方法
2023-07-04

Laravel Livewire如何使用

这篇文章主要讲解了“Laravel Livewire如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Laravel Livewire如何使用”吧!Laravel Livewire是一个
2023-07-04

laravel如何使用RabbitMQ

这篇文章主要介绍“laravel如何使用RabbitMQ”,在日常操作中,相信很多人在laravel如何使用RabbitMQ问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel如何使用RabbitMQ
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录