在 Laravel 中将请求输入值从空字符串更改为 null
Change request input values from empty string to null in Laravel
在我的控制器中,我收到一个 Illuminate\Http\Request
请求,其中包含一些值等于空字符串的数据:
dd($request->input())
//output
array:5 [▼
"_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4"
"param1" => "1"
"param2" => "2"
"param3" => ""
"param4" => ""
]
(基本上当用户在创建表单中没有做出任何选择时会发生这种情况,但是由于前端限制see here,我无法更改表单Request 以便排除空字符串值被发送到服务器)
请求输入数据用于将关系附加到模型。例如:
$book->authors()->attach($request->input('param1'));
问题是当输入值等于空字符串 ""
时,上面的行抛出一个 QueryException
,因为它试图添加一个等于 ""
的外键到支点 table。
另一方面,我注意到如果值是 null
而不是 ""
,则 attach()
方法不会被执行,因此不会抛出异常,当用户在输入表单中没有选择时,两者都不会更新数据库,这正是我想要的行为。
我的问题是 如何将请求值从 ""
更改为 null
? 我的第一个想法是制作一个迭代的辅助函数请求输入数组并将“”替换为 null 并在控制器中使用它,但这对我来说似乎不是一个好主意,因为在使用表单请求验证时,这不会阻止可能出现的不需要的验证错误。
有什么想法吗???
提前致谢
您不能在将项目添加到数据透视表之前检查一下吗table?
if(!empty($request->input('paramX'))){
$book->authors()->attach($request->input('paramX'));
}
注意:Laravel 5.4 现在附带此功能
https://laravel.com/docs/5.4/requests#input-trimming-and-normalization
对于 > 5.4 的版本,请参阅下面的答案或直接复制官方中间件。
制作一个中间件并将其分配给您希望它发生的路由或控制器方法。
示例:
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);
话虽如此,您可以按如下方式解决您的问题:
注释掉或将其放入 middilware
App\Http\Kernel.php:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
在我的控制器中,我收到一个 Illuminate\Http\Request
请求,其中包含一些值等于空字符串的数据:
dd($request->input())
//output
array:5 [▼
"_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4"
"param1" => "1"
"param2" => "2"
"param3" => ""
"param4" => ""
]
(基本上当用户在创建表单中没有做出任何选择时会发生这种情况,但是由于前端限制see here,我无法更改表单Request 以便排除空字符串值被发送到服务器)
请求输入数据用于将关系附加到模型。例如:
$book->authors()->attach($request->input('param1'));
问题是当输入值等于空字符串 ""
时,上面的行抛出一个 QueryException
,因为它试图添加一个等于 ""
的外键到支点 table。
另一方面,我注意到如果值是 null
而不是 ""
,则 attach()
方法不会被执行,因此不会抛出异常,当用户在输入表单中没有选择时,两者都不会更新数据库,这正是我想要的行为。
我的问题是 如何将请求值从 ""
更改为 null
? 我的第一个想法是制作一个迭代的辅助函数请求输入数组并将“”替换为 null 并在控制器中使用它,但这对我来说似乎不是一个好主意,因为在使用表单请求验证时,这不会阻止可能出现的不需要的验证错误。
有什么想法吗???
提前致谢
您不能在将项目添加到数据透视表之前检查一下吗table?
if(!empty($request->input('paramX'))){
$book->authors()->attach($request->input('paramX'));
}
注意:Laravel 5.4 现在附带此功能
https://laravel.com/docs/5.4/requests#input-trimming-and-normalization
对于 > 5.4 的版本,请参阅下面的答案或直接复制官方中间件。
制作一个中间件并将其分配给您希望它发生的路由或控制器方法。
示例:
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);
话虽如此,您可以按如下方式解决您的问题: 注释掉或将其放入 middilware App\Http\Kernel.php:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];