database - 在 Laravel 中将请求输入值从空字符串更改为 null

标签 database laravel httprequest jquery-select2

在我的 Controller 中,我收到一个 Illuminate\Http\Request 请求,其中包含一些值为空字符串的数据:

dd($request->input())

//output
array:5 [▼
  "_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4"
  "param1" => "1"
  "param2" => "2"
  "param3" => ""
  "param4" => ""
]

(基本上当用户在创建表单中没有做出任何选择时会发生这种情况,但由于前端限制 see here我无法更改请求的表单,以便排除空字符串值被发送到服务器)

请求输入数据用于将关系附加到模型。例如:

$book->authors()->attach($request->input('param1'));

问题是,当输入值等于空字符串 "" 时,上面的行抛出一个 QueryException,因为它试图添加一个外键等于"" 到数据透视表。

另一方面,我注意到如果值为 null 而不是 "",则不会执行 attach() 方法因此,当用户未在输入表单中进行选择时,不会抛出异常,也不会更新数据库,这正是我想要的行为。

我的问题是如何将请求值从""更改为null我的第一个想法是制作一个辅助函数遍历请求输入数组并将“”替换为 null 并在 Controller 中使用它,但这对我来说似乎不是一个好主意,因为在使用表单请求验证时,这不会阻止可能出现的不需要的验证错误。

有什么想法吗???

提前致谢

最佳答案

注意:Laravel 5.4 现在附带此功能

https://laravel.com/docs/5.4/requests#input-trimming-and-normalization

对于 > 5.4 的版本,请参阅下面的答案或直接复制官方中间件。


HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application.

制作一个中间件并将其分配给您希望它发生的路由或 Controller 的方法。

例子:

class SanitizeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        foreach ($request->input() as $key => $value) {
            if (empty($value)) {
                $request->request->set($key, null);
            }
        }

        return $next($request);
    }
}
Route::post('/users', function (Request $request) {

    dd($request->input());

})->middleware(SanitizeMiddleware::class);

关于database - 在 Laravel 中将请求输入值从空字符串更改为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745580/

相关文章:

php - 将过滤器从接受今天更改为同时接受昨天+今天

php - 使用 product_id 上传的 Laravel dropzone 问题

Node.JS 从 Http 请求 POST 获取数据

c# - 如何从 ASP.NET Core 中的 Request.Body 读取参数

sql-server - 不同的架构会在从一个或多个分片检索数据时产生错误。收到的底层错误消息是 : Invalid object name

c++ - 有人使用 boost::multiindex 作为单表数据库吗?

php - 组织 Laravel 和自动加载子目录

c# - 如何在 azure 函数中访问 http 请求的所有字段(在 C# 中解析 JSON)?

database - 在 sqlite 中删除查询

c# - dll 中的静态属性生存期或缓存方法