2016-07-07 135 views
0

對不起,如果這個問題是其他地方問的,但我到處搜索,但無法找到答案。好吧,我面臨這個問題上Laravel 5.0,當我嘗試從一個請求得到一個變量的,即時得到生產服務器上但IM的開發服務器上得到一個空字符串。該值在請求中不存在,即當表單提交時該字段爲空。例如。laravel檢索請求輸入返回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表上有'默認0'

爲什麼會發生這種情況?

UPDATE:

這段時間我認爲請求 - >輸入()方法返回空字符串(「」),如果字段不存在。但只知道我看着laravel源看到這個:

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

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

這裏它返回null作爲默認值。那麼爲什麼我在開發服務器上獲得空字符串?

回答

2

發生這種情況是因爲如果您沒有定義任何內容,mysql會插入默認值。在這種情況下,Laravel發送一個值爲null的值。你不應該使用Request::only,而應該使用數組。

它總是很好的具體,它使您的代碼可讀性和一致性。

+0

我試過$請求 - >只(),但它也返回null。這是由不同的PHP版本呢? – bazi

+0

我在說你應該*不*請求 - >只有 –

+0

好。但如果我使用一個數組像$ data = ['name'=> $ request-> name,'price'=> $ request-> price]; ,$ data ['price']仍然爲空。這也不能解決我的問題。 – bazi

1

輸入修剪&正常化

默認情況下,Laravel包括在應用程序的全球中間件堆棧的TrimStringsConvertEmptyStringsToNull中間件。這些中間件在App\Http\Kernel類的堆棧中列出。這些中間件將自動修剪請求中的所有傳入字符串字段,並將任何空字符串字段轉換爲null。這使您不必擔心路線和控制器中的這些標準化問題。

如果要禁用此行爲,可以從應用程序的中間件堆棧中刪除這兩個中間件,將它們從App\Http\Kernel類的$middleware屬性中移除。

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