Метод fill
Метод fill применяется к экземпляру модели Eloquent
и позволяет заполнить её атрибуты значениями из переданного
массива. Первым параметром передаётся массив данных,
где ключи - это имена атрибутов модели, а значения -
соответствующие данные для заполнения. Метод учитывает
свойства fillable и guarded модели,
обеспечивая защиту от массового присваивания.
Для принудительного заполнения всех полей используется
метод forceFill.
Синтаксис
<?php
$model->fill($attributes);
?>
Пример с заполняемыми полями
Для начала определим модель с указанием заполняемых полей:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $fillable = [
'title',
'content',
'status'
];
}
?>
Теперь создадим новый экземпляр модели и заполним её атрибуты:
<?php
use AppModelsArticle;
$article = new Article();
$res = $article->fill([
'title' => 'Laravel Eloquent',
'content' => 'Article content',
'status' => 'draft'
]);
echo $res->title;
echo $res->status;
?>
Результат выполнения кода:
"Laravel Eloquent"
"draft"
Пример с защищёнными полями
Если в модели определено свойство guarded,
указанные поля будут защищены от массового заполнения:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
protected $guarded = [
'is_admin',
'password_hash'
];
}
?>
Попробуем заполнить защищённые поля:
<?php
use AppModelsUser;
$user = new User();
$user->fill([
'name' => 'John Doe',
'email' => 'john@example.com',
'is_admin' => true,
'password_hash' => 'hashed_password'
]);
echo $user->name;
echo $user->is_admin;
?>
Результат выполнения кода:
"John Doe"
""
Как видно, защищённые поля не были заполнены, их значения остались пустыми.
Пример с сохранением после заполнения
Метод fill часто используется вместе с методом
save для сохранения модели в базу данных:
<?php
use AppModelsArticle;
$article = new Article();
$article->fill([
'title' => 'New Article',
'content' => 'This is a new article',
'status' => 'published'
]);
$article->save();
echo $article->id;
?>
Результат выполнения кода:
"5"
Пример с принудительным заполнением
Метод forceFill позволяет заполнить атрибуты,
даже если они защищены правилами массового присваивания:
<?php
use AppModelsUser;
$user = new User();
$user->forceFill([
'name' => 'Admin User',
'email' => 'admin@example.com',
'is_admin' => true
]);
echo $user->is_admin;
?>
Результат выполнения кода:
"1"