MySQL не будет рассматривать пустую строку как null просто потому, что пустая строка и null - это разные вещи. Таким образом, сообщение, которое вы получаете от MySQL, не является странным, оно верное.
Обнулить все пустые строки в массиве
Если вы просто хотите обнулить все пустые строки в массиве, вы может создать для него простую функцию:
function nullifyEmptyStrings(array $array)
{
return array_map(function ($item) {
return $item !== '' ? $item : null;
}, $array);
}
Затем вызовите ее, когда / когда она вам понадобится:
$row = nullifyEmptyStrings($row);
или используйте ее непосредственно в аргументе для функции create:
MyModel::create(nullifyEmptyStrings($row));
Вот демонстрация
Обнулить спецификацию c пустые строки в массиве
Если вы хотите иметь возможность определять, какой массив элементы для обнуления, вы можете использовать эту функцию:
function nullifyEmptyArrayValues(array $array, array $keys)
{
foreach ($keys as $key) {
if (array_key_exists($key, $array) && $array[$key] === '') {
$array[$key] = null;
}
}
return $array;
}
И в своем коде вы сначала передаете массив, содержащий данные, а затем другой массив с ключами для обнуления, если значения пусты:
$row = nullifyEmptyArrayValues($row, ['some-key', 'another-key']);
Вот демонстрация