【问题标题】:laravel retrieving request input returns nulllaravel 检索请求输入返回 null
【发布时间】:2016-07-07 07:54:26
【问题描述】:

对不起,如果这个问题在其他地方被问到,但我到处搜索但找不到答案。好吧,我在 Laravel 5.0 上遇到了这个问题,当我尝试从请求中获取变量时,我在 Production Server 上获得了 null 值,但我得到了一个 开发服务器上的>空字符串。请求中不存在该值,即提交表单时该字段为空。例如。

// ProductController
public function store(Request $request) {
    // this field is actually empty in the submitted form
    $price = $request->price;
    // when it gets to the server this is how this value looks like :
    // $price in production server : null
    // $price in development server : ''
}

当我尝试将对象保存到数据库中时

Product::save($request->only('name', 'price'));

我收到此错误(仅在生产服务器上)

SQLSTATE[23000]:违反完整性约束:1048 列“价格” 不能为空

注意价格列在mysql表上有'default 0'

为什么会这样?

更新:

一直以来,我认为如果该字段不存在,request->input() 方法会返回空字符串('')。但只知道我查看了 laravel 源代码:

public function input($key = null, $default = null)
{
    $input = $this->getInputSource()->all() + $this->query->all();

    return array_get($input, $key, $default);
}

这里它返回 null 作为默认值。那为什么我在开发服务器上得到空字符串?

【问题讨论】:

    标签: php mysql string laravel null


    【解决方案1】:

    发生这种情况是因为如果您没有定义任何内容,mysql 会插入默认值。在这种情况下,Laravel 发送一个值为 null 的值。你不应该使用Request::only,而是使用数组。

    具体一点总是好的,它使您的代码可读且一致。

    【讨论】:

    • 我试过 $request->only(),但它也返回 null。这是否与不同的 PHP 版本有关?
    • 我是说你应该使用 request->only
    • 好的。但如果我使用像 $data = ['name' => $request->name, 'price' => $request->price]; 这样的数组, $data['price'] 仍然为空。这也不能解决我的问题。
    【解决方案2】:

    输入修剪和标准化

    默认情况下,Laravel 在应用程序的全局中间件堆栈中包含 TrimStringsConvertEmptyStringsToNull 中间件。这些中间件按App\Http\Kernel 类列在堆栈中。这些中间件将自动修剪请求中所有传入的字符串字段,并将任何空字符串字段转换为null。这使您不必担心路由和控制器中的这些规范化问题。

    如果您想禁用此行为,您可以从您的App\Http\Kernel 类的$middleware 属性中删除这两个中间件,从应用程序的中间件堆栈中删除它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多