Добавьте [title] к заполняемому свойству, чтобы разрешить массовое назначение в [App \ Post]

При вставке данных в 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();
   

Может ли кто-нибудь объяснить, почему верхняя часть кода выдает ошибку?

Возможный дубликат Что означает «массовое назначение» в Laravel?

Walter Cejas 15.12.2018 15:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
39
1
90 457
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

В вашей модели Post будет переменная массива $fillable, к которой вы должны добавить заголовок.

Для получения дополнительной информации: Что означает «массовое назначение» в Laravel?

Ответ принят как подходящий

Добавьте заголовок к заполняемому массиву в вашей модели Post, чтобы можно было сохранить за счет создания и массовых методов.

protected $fillable = ['title'];

Понятно! Спасибо. Не могли бы вы указать, какой подход лучше?

Muhammad Mansha 15.12.2018 15:10

Или вы можете использовать protected $ guarded = []; и сделайте заполняемым каждое поле, купите по соображениям безопасности, рекомендуется использовать $ fillable и вставлять туда каждое заполняемое поле

Walter Cejas 15.12.2018 15:13

Для массового назначения вы должны определить в своей модели «Заполняемый массив» (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.

TiDJ 13.11.2019 16:45

Хотя это проще, это создает проблемы с безопасностью. Кто-то может изменить вашу форму и ввести поле id, а также обновить свой идентификатор в БД. Или salary или любое другое чувствительное поле.

Sandy 09.07.2020 13:20

Ошибка исключения преобразования массива в строку

Mohamed Raza 15.12.2020 17:47

@MohamedRaza, это ошибка другого типа и не имеет к этому никакого отношения. Проверьте свой код.

Armin 17.12.2020 18:30

Хорошо, @Armin понял

Mohamed Raza 18.12.2020 06:14

Это должно быть стандартное поведение по умолчанию для всех моделей. Может быть, я заставлю все мои модели расширить другой класс, в котором есть эта строка.

Magmatic 21.10.2021 16:09

За $ 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. Как объясняется в тур, этот сайт представляет собой хранилище полезных вопросов и ответов на них. Ваш ответ (включен в) / (очень похож на) этот ответ и не очень полезен, поскольку он не добавляет никаких новых значений или информации. Пожалуйста, избегайте повторения ответов. Либо отредактируйте свой ответ, чтобы добавить ценность, либо удалите его совсем; это гарантирует, что все вопросы и ответы на сайте останутся полезными и не будут разбросаны / дублированы.

Clément Baconnier 19.10.2021 11:50

Я опаздываю на вечеринку, но у меня была эта проблема, и решение было совершенно другим.

Внутри моего 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,
    ]);

Как по волшебству, это работает.

Если кто-нибудь с более продвинутыми знаниями сможет объяснить, что Зачем работает, мне было бы очень интересно узнать. Спасибо!

Другие вопросы по теме