很抱歉,如果在别处问过这个问题,但我到处搜索但找不到答案。好吧,我在Laravel 5.0上面临这个问题,当我尝试从请求中获取变量时,我在生产服务器上获得 null 值但是我得到了一个开发服务器上的>空字符串。该请求中不存在该值,即在提交表单时该字段为空。例如
echo "<pre>";
print_r($results);
echo "</pre>";
当我尝试将对象保存到像
这样的数据库时// 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 : ''
}
我收到此错误(仅在生产服务器上)
SQLSTATE [23000]:完整性约束违规:1048列“价格” 不能为空
请注意,价格列在mysql表
上有'默认0'为什么会这样?
更新
所有这一次,我认为如果字段不存在,request-&gt; input()方法返回空字符串('')。但只是知道我看了laravel来源看到这个:
Product::save($request->only('name', 'price'));
这里它返回null作为默认值。那为什么我在开发服务器上得到空字符串?
答案 0 :(得分:1)
这种情况正在发生,因为如果您没有定义任何内容,mysql会插入默认值。在这种情况下,Laravel发送一个值为null。您不应该使用Request::only
,而是使用数组。
具体而言总是好的,它使您的代码可读且一致。
答案 1 :(得分:1)
输入修剪&amp;归一化强>
默认情况下,Laravel在应用程序的全局中间件堆栈中包含
TrimStrings
和ConvertEmptyStringsToNull
中间件。这些中间件由App\Http\Kernel
类列在堆栈中。这些中间件将自动修剪请求中的所有传入字符串字段,并将任何空字符串字段转换为null
。这使您无需担心路由和控制器中的这些规范化问题。如果要禁用此行为,可以从应用程序的中间件堆栈中删除这两个中间件,方法是将它们从
$middleware
类的App\Http\Kernel
属性中删除。
来自:https://laravel.com/docs/5.4/requests#input-trimming-and-normalization