Массовое назначение не будет обрабатывать нулевой ввод, даже если для миграции задано значение по умолчанию. - PullRequest
1 голос
/ 29 мая 2019

Я часто использую массовые задания. Недавно я столкнулся с этой проблемой, где я создаю заполняемый, а также по умолчанию для нулевых значений, но при использовании массового присваивания, если мои входные данные пустые, он возвращает ошибку «Cannot Be Null».

Моя модель

protected $fillable = ['name','status'];

Мой контроллер

$this->model->create($request->all());

Моя миграция

$table->boolean('status')->default(0);

Разве вышеприведенное не должно означать, что когда я ничего не предоставляю в поле ввода status, по умолчанию оно должно равняться 0? Но столбец не может быть null брошен.

Есть ли какое-нибудь решение для этого?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Полагаю, у вас проблема из-за промежуточного программного обеспечения ConvertEmptyStringsToNull, которое было добавлено в laravel> = 5.4. Это промежуточное ПО конвертирует все пустые строки в null. Поэтому, если вы не установите какое-либо значение в поле status, это будет null. Ваша миграция не ->nullable(), поэтому выдается ошибка Cannot Be Null.

Вы можете решить это так:

$all = $request->all();

if(is_null($request->get('status')))
{
     unset($all['status']);
}

$this->model->create($all);
1 голос
/ 29 мая 2019

Я сам столкнулся с этим.Загляните в файл app \ Http \ Kernel.php .Существует промежуточное программное обеспечение Laravel, которое преобразует ваши пустые входные данные в нулевые значения.Таким образом, даже если у вас правильно настроено массовое назначение и миграция по умолчанию равна 0, это промежуточное ПО изменяет значение до того, как оно достигнет этих точек.Код, который вы ищете, похож на:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // <<-- This one
];

Вы можете удалить его или оставить в нем и написать метод для компенсации всех входных данных.Я просто удалил это и затем установил мутатор, чтобы сделать то, что промежуточное программное обеспечение сделало для тех входов, которые я хотел бы обнулить.

HTH

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