laravel では、fill メソッドは Eloquent インスタンスに属性を割り当てるためのメソッドであり、このメソッドは、このメソッドが使用されている場合、フロントエンドによって送信されるモデルに対応する冗長なフィールドをフィルタリングするために使用されると理解できます。呼び出されると、まず現在のモデルのステータスを検出するために、モデルは入力可能な配列の設定に従ってさまざまな状態になります。
#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。
fill メソッドは、Eloquent インスタンスに属性を割り当てるためのメソッドです。
fill メソッドをクリックして、そのソースを見てみましょう。 code first: Array
ここで著者が使用しているバージョンは、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 が最初に独自の totalGuarded メソッドを呼び出すことを確認して、このメソッドをクリックしましょう: Function
public function totallyGuarded() { return count($this->getFillable()) == 0 && $this->getGuarded() == ['*']; }
このメソッドの機能は、独自の fillable と Guarded を取得し、それらがそれらのメソッドであるかどうかを判断することであることがわかります。両方ともバッチ割り当てできない状態にあり、最後にブール値を返します。
// 返回一个 True or False 的布尔值 // 若是未设置 fillable 与 guarded,则会返回 True (注意,在这种状况下,此 `Model` 是不容许批量赋值任何属性的哦) // 反之则返回 False $totallyGuarded = $this->totallyGuarded();
わかりました。先ほどの fill メソッドに戻って、引き続きデザインを見てみましょう
次のstep は 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 と属性の間の交差の値が返されます。そうでない場合は、属性自体のイベント
# を返し、fill に戻ります。fillableFromArray を呼び出してパラメータを処理した後、戻り値は、バッチ割り当てを許可する属性 (定義している場合) のみになりました。 ip
最初の行をループし、最初にremoveTableFromKeyを使用してパラメータのキーを処理し、テーブル名を削除します。このメソッドはあまり説明しませんが、文字列を分割して値 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 では、まず、このモデルに対してガードが無効になっているかどうかを判断します。このモデルに対して有効になっていない場合は、直接 True を返します
if (static::$unguarded) { return true; }
ガードが有効な場合は、この属性が入力可能な配列に存在するかどうかが判断され、存在する場合は True が返されます。
if (in_array($key, $this->getFillable())) { return true; }
このプロパティが入力可能な配列に存在しない場合、Laravel はこのプロパティが保護された配列に存在するかどうかを再度判断します。この配列に存在する場合、このプロパティはバッチで割り当てられる属性ではないため、直接 False を返します
if ($this->isGuarded($key)) { return false; }
上記のいずれも満たされない場合、Laravel は最終的にその入力可能な配列が空であり、この属性が _ で始まるかどうかを判断し、ブール値
return empty($this->getFillable()) && ! Str::startsWith($key, '_');
$this->setAttribute($key, $value);
// 判断此属性是否经过了检测 if ($this->isFillable($key)) { // 将此属性赋值给自身 $this->setAttribute($key, $value); // 若是没有经过检测,那么判断一下自身 `Model` 是否为所有不可批量赋值状态,若是是,那么会抛出一个 `Exception` } elseif ($totallyGuarded) { throw new MassAssignmentException($key); }
ガードされた配列ではなく入力可能な配列を設定すると、次にこのモデルが検出されます。指定した属性のみを一括で割り当てられる状態になります。入力可能な配列を設定せず、ガード配列を設定すると、このモデルは任意の属性を一括で割り当てられる状態になります。バッチLaravel ではそれが禁止されているため、fillable 配列と保護された配列を同時に設定する状況については説明しません。属性と塗りつぶし可能な配列の交差部分。塗りつぶし可能を定義していない場合、またはガードを無効にしている場合、このメソッドは直接属性を返します そして、Laravel は返された配列に対してループを作成します。このループでは、Laravel は次のことを行います。この属性を検出するには、各属性に対して isFillable メソッドを呼び出します。このメソッドで検出されない場合 (入力可能な配列に存在せず、保護された配列を設定していないか、保護された配列に存在する)、入力できるかどうかを調べます。 Laravel は、現在のモデルが指定された属性のみをバッチで割り当てられる状態にあるかどうかを確認します。そうであれば、例外が直接
スローされ、Laravel はその後 $this
を返します。代入操作を完了する [関連する推奨事項:
laravel ビデオチュートリアル]
以上がlaravelのfillメソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。