Атрибут guarded
Атрибут guarded в модели Eloquent определяет поля, которые нельзя заполнять через массовое присваивание. Это работает как "чёрный список" - если поле перечислено в guarded, то оно будет защищено от массового заполнения. Если массив пустой, то все поля доступны для массового присваивания.
Синтаксис
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $guarded = ['field1', 'field2'];
}
?>
Атрибут guarded определяет массив полей, которые защищены от массового присваивания. Это противоположность атрибуту fillable, который определяет разрешённые поля.
Пример
Давайте защитим поле 'status' от массового заполнения:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $guarded = ['status'];
}
?>
Теперь попробуем создать статью с массовым присваиванием:
<?php
use AppModelsArticle;
$data = [
'title' => 'article 1',
'text' => 'text of article 1',
'status' => 'published'
];
$article = Article::create($data);
echo $article->title;
echo $article->status;
?>
Результат выполнения кода:
"article 1"
""
Поле 'status' не было заполнено, так как оно защищено атрибутом guarded.
Пример
Защитим несколько полей одновременно:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
protected $guarded = ['id', 'email', 'password'];
}
?>
Попробуем создать пользователя с защищёнными полями:
<?php
use AppModelsUser;
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'secret'
];
$user = User::create($data);
echo $user->name;
echo $user->email;
?>
Результат выполнения кода:
"John Doe"
""
Поля 'email' и 'password' защищены от массового присваивания.
Пример
Используем пустой массив для разрешения всех полей:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
protected $guarded = [];
}
?>
Теперь все поля доступны для массового присваивания:
<?php
use AppModelsPost;
$data = [
'title' => 'post 1',
'text' => 'text of post 1',
'category' => 'news'
];
$post = Post::create($data);
echo $post->title;
echo $post->category;
?>
Результат выполнения кода:
"post 1"
"news"
Все поля были успешно заполнены, так как атрибут guarded пуст.
Пример
Защитим все поля с помощью специального символа '*':
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Comment extends Model
{
protected $guarded = ['*'];
}
?>
Попробуем создать комментарий с защищёнными полями:
<?php
use AppModelsComment;
$data = [
'text' => 'comment text',
'user_id' => 1,
'post_id' => 5
];
$comment = Comment::create($data);
echo $comment->text;
echo $comment->user_id;
?>
Результат выполнения кода:
""
""
Все поля защищены, поэтому ни одно значение не было заполнено.