mysql表默认null 但是传入空值 laravel怎么处理是正确姿势?

有大量的表单是文本,因为要手写,字段是int 默认null,可以不填。

插入的时候不填就会传入'' 报错,因为有大量的这种字段,在哪里处理比较好?

阅读 7.2k
5 个回答

有两种方法供你选择:

  • 使用Laravel集合的 map 方法。该方法适用于单个表单。

  • 使用中间件。该方法适用于有多个表单

单个表单


可以使用集合的map方法进行过滤,然后使用得到的 $params 进行操作。

public function post(Request $request)
{
    // 过滤空值,并且trim
    $params = collect($request)->map(function ($item) {
        if (is_string($item)) {
            $item = empty(trim($item)) ? null : trim($item);
        }
        return $item;
    });

    // 现在表单的内容在 $params 中了,并且去掉了空值
}

关于里面函数的具体意义请参考官方文档

多个表单


首先推荐看一下官方文档
其实也是使用了上面的代码进行过滤,不过这是在中间件中进行的,只要在需要进行过滤的路由中使用这个中间件即可做到,这样无需再每一个Controller中写一遍了。

  • 先用 php artisan make:middleware RejectEmptyValues 命令创建一个中间件。
    此命令将会在 app/Http/Middleware 目录内设定一个名称为 RejectEmptyValues 的类。

  • 修改 RejectEmptyValues 的代码

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class RejectEmptyValues
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request $request
         * @param  \Closure $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // 过滤空值,并且trim
            $params = collect($request)->map(function ($item) {
                if (is_string($item)) {
                    $item = empty(trim($item)) ? null : trim($item);
                }
                return $item;
            });
            $request->replace($params->all());
    
            return $next($request);
        }
    }
  • 注册中间件,在 app/Http/Kernel.php 文件的 $routeMiddleware 中加入一行

    'reject_empty_values' => \App\Http\Middleware\RejectEmptyValues::class, 
  • 使用中间件示例,

    Route::post('/test','TestController@post')->middleware('reject_empty_values');

你是想省劲点的话,直接重载下model的save函数呗

在里面把所有的attributes遍历一遍,把空字符串的值都unset掉,然后再调用父类的save函数

int类型默认最好是0

在需要录入的文本赋值给对象字段是用三元运算符可以不例如我的做法是
$goods->is_sales = ($request->input('is_sales')=='是')?1:0;

1.首先你可以在request 验证一下,把空的过滤
2.第二就是在mysql设计数据库的时候最好设置为NOT NULL ,或者给一个默认值,这样最好

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题