При вставке данных в Mysql я обнаружил следующую ошибку:
«Добавьте [title] в свойство fillable, чтобы разрешить массовое назначение в [App \ Post]».
Вот мой код:
$post = Post::create([
'title' => $request->input('title'),
'body' => $request->input('body')
]);
Хотя, когда я использую другой способ вставки данных, он работает нормально: Следующий код работает нормально:
//Create Post
$post = new Post;
$post->title = $request->input('title');
$post->body = $request->input('body');
$post->save();
Может ли кто-нибудь объяснить, почему верхняя часть кода выдает ошибку?






В вашей модели Post будет переменная массива $fillable, к которой вы должны добавить заголовок.
Для получения дополнительной информации: Что означает «массовое назначение» в Laravel?
Добавьте заголовок к заполняемому массиву в вашей модели Post, чтобы можно было сохранить за счет создания и массовых методов.
protected $fillable = ['title'];
Понятно! Спасибо. Не могли бы вы указать, какой подход лучше?
Или вы можете использовать protected $ guarded = []; и сделайте заполняемым каждое поле, купите по соображениям безопасности, рекомендуется использовать $ fillable и вставлять туда каждое заполняемое поле
Для массового назначения вы должны определить в своей модели «Заполняемый массив» (App \ Post)
Итак, ваша модель должна быть примерно такой:
class Post extends Model
{
protected $fillable = ['title','body']; //<---- Add this line
// ...
}
Дополнительная информация: [https://laravel.com/docs/5.7/eloquent#mass-assignment visible[1]
Эта ошибка возникла из-за того, что вы не объявили переменную в своей модели - вы должны определить ее в своем классе следующим образом;
protected $fillable = ['title'];
Альтернативой protected $fillable = ['title']; может быть:
protected $guarded = [];
и оставьте его как пустой массив без необходимости определять что-либо внутри.
Это полная противоположность $fillable, что-то вроде указания базе данных принимать все, кроме полей, которые вы указываете внутри массива $guarded.
Да, это проще, чем добавлять каждое поле в массив $ fillable.
Хотя это проще, это создает проблемы с безопасностью. Кто-то может изменить вашу форму и ввести поле id, а также обновить свой идентификатор в БД. Или salary или любое другое чувствительное поле.
Ошибка исключения преобразования массива в строку
@MohamedRaza, это ошибка другого типа и не имеет к этому никакого отношения. Проверьте свой код.
Хорошо, @Armin понял
Это должно быть стандартное поведение по умолчанию для всех моделей. Может быть, я заставлю все мои модели расширить другой класс, в котором есть эта строка.
За $ fillable все
protected $guarded = ['id'];
Все модели Laravel при создании не содержат никаких заполняемых свойств.
Чтобы позволить им принимать данные поля и вставлять их в базу данных, мы должны сначала разрешить их в нашей модели.
В вашей модели Post добавьте эту строку:
protected $fillable = ['title'];
лучший вариант предотвратить одно поле
Post::create($request->except('_token'));
Проверить документы здесь
Alternatively, you may use the create method to "save" a new model using a single PHP statement. The inserted model instance will be returned to you by the create method:
use App\Models\Flight;
$flight = Flight::create([
'name' => 'London to Paris',
]);
However, before using the create method, you will need to specify either a fillable or guarded property on your model class. These properties are required because all Eloquent models are protected against mass assignment vulnerabilities by default.
Добавьте заголовок к заполняемому массиву в публикации вашей модели.
protected $fillable = ['title'];
Привет, добро пожаловать в Stack Overflow. Как объясняется в тур, этот сайт представляет собой хранилище полезных вопросов и ответов на них. Ваш ответ (включен в) / (очень похож на) этот ответ и не очень полезен, поскольку он не добавляет никаких новых значений или информации. Пожалуйста, избегайте повторения ответов. Либо отредактируйте свой ответ, чтобы добавить ценность, либо удалите его совсем; это гарантирует, что все вопросы и ответы на сайте останутся полезными и не будут разбросаны / дублированы.
Я опаздываю на вечеринку, но у меня была эта проблема, и решение было совершенно другим.
Внутри моего PostController я проверял auth, а затем обнаружил:
Post::where('slug', $oldSlug)->first()->update([
'image_url' => $request->image_url,
'slug' => $newSlug,
'title' => $request->title,
'body' => $request->body,
'description' => $request->description,
'user_id' => auth()->user()->id,
'catagory' => $request->catagory,
]);
Я смотрел на него, пытаясь понять, почему ему не нравится «image_url», крича «Добавьте ['image_url'] в свойство fillable, чтобы разрешить массовое назначение».
Я понял, что добавил ->first(), чтобы убедиться, что получаю только одно сообщение, но, поскольку все слаги проверены на уникальность, я отказался от ->first().
Post::where('slug', $oldSlug)->update([
'image_url' => $request->image_url,
'slug' => $newSlug,
'title' => $request->title,
'body' => $request->body,
'description' => $request->description,
'user_id' => auth()->user()->id,
'catagory' => $request->catagory,
]);
Как по волшебству, это работает.
Если кто-нибудь с более продвинутыми знаниями сможет объяснить, что Зачем работает, мне было бы очень интересно узнать. Спасибо!
Возможный дубликат Что означает «массовое назначение» в Laravel?