php - mysql表默认null 但是传入空值 laravel怎么处理是正确姿势?
黄舟
黄舟 2017-04-10 18:00:11
[PHP讨论组]

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

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(5)
大家讲道理

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

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

怪我咯

int类型默认最好是0

伊谢尔伦

有两种方法供你选择:

  • 使用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');
ringa_lee

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

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号