溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

laravel的fill方法如何用

發(fā)布時間:2022-06-06 16:27:31 來源:億速云 閱讀:255 作者:iii 欄目:編程語言

今天小編給大家分享一下laravel的fill方法如何用的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

在laravel中,fill方法是一個給Eloquent實例賦值屬性的方法,該方法可以理解為用于過濾前端傳輸過來的與模型中對應(yīng)的多余字段;當(dāng)調(diào)用該方法時,會先去檢測當(dāng)前Model的狀態(tài),根據(jù)fillable數(shù)組的設(shè)置,Model會處于不同的狀態(tài)。

本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。

laravel的fill方法怎么用

fill 方法是一個給 Eloquent 實例賦值屬性的方法,

讓咱們點(diǎn)開 fill 方法先看一看它的源碼:數(shù)組

這里筆者所使用的版本為 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 會先去調(diào)用一個自身的 totallyGuarded 方法,讓咱們點(diǎn)開這個方法:函數(shù)

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

能夠看到這個方法的做用就是去獲取自身的 fillable 與 guarded,而后判斷他們是否都為 不可批量賦值 狀態(tài),最后返回一個布爾值this

// 返回一個 True or False 的布爾值
// 若是未設(shè)置 fillable 與 guarded,則會返回 True (注意,在這種狀況下,此 `Model` 是不容許批量賦值任何屬性的哦)
// 反之則返回 False
$totallyGuarded = $this->totallyGuarded();

Ok,讓咱們回到剛才的 fill 方法繼續(xù)往下看設(shè)計

接下來是一個 foreach 循環(huán),可是在循環(huán)以前,Laravel 對傳入的賦值屬性執(zhí)行了 fillableFromArray 這個方法,再點(diǎn)進(jìn)去看一下,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 數(shù)組中定義了值,若是定義了值,則會返回 fillable 與 attributes 相交的值,若是沒有,則返回 attributes 自身事件

而后回到 fill ,在調(diào)用 fillableFromArray 對參數(shù)進(jìn)行處理以后,如今返回的值只剩咱們?nèi)菰S批量賦值的屬性了 (若是你定義了)ip

循環(huán)第一行,先使用 removeTableFromKey 對參數(shù)的 Key 進(jìn)行處理,刪除鍵中的表名,此方法就不作過多講解,只是一個字符串拆分取值的函數(shù)rem

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

接著往下看,Laravel對將要進(jìn)行填充的每一個屬性都調(diào)用了 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 是否禁用了守衛(wèi) (guarded),若是此 Model 并未啟用守衛(wèi),那么直接返回 True

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

若是啟用了守衛(wèi),那么會判斷一下此屬性是否存在于 fillable 數(shù)組中,若是存在,則返回 True,

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

若是此屬性不存在于 fillable 數(shù)組中,那么 Laravel 會再次判斷此屬性是否存在于 guarded 數(shù)組中,若是存在于此數(shù)組中,那么此屬性就不是一個能夠被批量賦值的屬性,那么就會直接返回 False

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

若是以上都不符合,那么 Laravel 在最后會判斷一下自身的 fillable 數(shù)組是為空而且此屬性是以 _ 開頭,而后返回一個布爾值

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

而后回到 fill 方法接著看,若是此屬性經(jīng)過了 isFillable 方法的過濾,那么將此屬性賦值給自身 (由于時間有限,setAttribute 這個方法就不細(xì)講啦~),

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

若是沒有經(jīng)過 isFillable 方法的過濾,那么 Laravel 會判斷一下自身 Model 是否處于不限制任何屬性批量賦值的狀態(tài),若是不是,那么 Laravel 會直接拋出一個 Exception

// 判斷此屬性是否經(jīng)過了檢測
if ($this->isFillable($key)) {
    // 將此屬性賦值給自身
    $this->setAttribute($key, $value);
// 若是沒有經(jīng)過檢測,那么判斷一下自身 `Model` 是否為所有不可批量賦值狀態(tài),若是是,那么會拋出一個 `Exception`
} elseif ($totallyGuarded) {
    throw new MassAssignmentException($key);
}

在對全部的屬性進(jìn)行檢測而且賦值后, Laravel 會將自身返回

return $this;

解析完畢,以上就是 fill 方法的源碼啦~,最后來一個小結(jié)

在你調(diào)用 fill 方法的時候,Laravel 首先就會去檢測當(dāng)前 Model 的狀態(tài),

當(dāng)你設(shè)置了 fillable 數(shù)組,沒有設(shè)置 guarded 數(shù)組時,那么此 Model 會處于 僅可批量賦值指定屬性 的狀態(tài)

當(dāng)你沒有設(shè)置 fillable 數(shù)組,卻設(shè)置了 guarded 數(shù)組時,那么此 Model 會處于 可批量賦值任何屬性 的狀態(tài)

至于你同時設(shè)置了 fillable 與 guarded 數(shù)組的狀況就不去討論了,由于這樣作自己就是被 Laravel 所禁止的

而后調(diào)用 fillableFromArray 去獲取 attributes 與 fillable 數(shù)組的交集,若是你沒有定義 fillable 或者禁用掉了守衛(wèi),那么此方法會直接返回 attributes

而后 Laravel 會對返回的數(shù)組作一個循環(huán),在這個循環(huán)中 Laravel 會對每個屬性調(diào)用 isFillable 方法檢測這個屬性是否能夠被填充,若是沒有經(jīng)過此方法的檢測(不存在于fillable 數(shù)組中而且沒有設(shè)置 guarded 數(shù)組或存在于 guarded 數(shù)組中),那么 Laravel會檢測當(dāng)前 Model 是否處于 僅可批量賦值指定屬性 狀態(tài),若是是,那么會直接拋出一個 Exception

而后 Laravel 會返回完成賦值操做后的 $this

以上就是“l(fā)aravel的fill方法如何用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI