2017-03-08 59 views
1

數組鑑於整數數組:驗證整數

[1, 2, 3, 4, ...] 

如何使用驗證,以檢查是否每個這些表中的存在?可能沒有foreach循環?

$validator = Validator::make($request->all(), [ 
    'array' => 'required|exists:users,id' 
]); 

回答

5

您的驗證。如果存在驗證與數組一起使用,它將自動使用where in作爲存在查詢。

因此,根據您所寫的驗證,驗證將獲得users記錄的計數,其中id字段位於您的array輸入提供的ID列表中。

因此,如果您array[1, 2, 3, 4],它會得到計數,其中users.id in (1,2,3,4)和比較,爲元素的個數在array數組(4)。如果查詢計數> =數組數量,則驗證通過。

這裏要注意兩點:如果你檢查的列不是唯一的,或者你的數組數據有重複的元素。

如果您檢查的列不是唯一的,那麼您的查詢計數可能> =數組數,但並非實際存在陣列中的所有ID。如果你的數組是[1, 2, 3, 4],但你的表有四個ID爲1的記錄,即使帶有2,3,4的記錄不存在,驗證也會通過。

對於數組重複值,如果你的陣列是[1, 1],但你只有一條記錄爲1的ID,驗證將失敗,因爲該查詢次數爲1,但你的數組數爲2

要解決這兩個警告,你可以做個別的數組元素驗證。你的規則看起來是這樣的:

$request = [ 
    'ids' => [1, 2, 3, 4], 
]; 

$rules = [ 
    'ids' => 'required|array', 
    'ids.*' => 'exists:users,id', // check each item in the array 
]; 

$validator = Validator::make($request, $rules); 

dd($validator->passes(), $validator->messages()->toArray()); 

請記住,每個元素將被單獨驗證,因此它將運行在ids陣列中的每個元素一個新的查詢。

+0

有沒有辦法做一個批量檢查,即檢查所有在一個單一的查詢? – user7675955

+0

@ user7675955我已經更新了我的答案 – patricus

0

你可以讓你custom rule

public function validateArrayInt($attribute, $value, $parameters){ 
    return array_filter(value, 'is_int') 
} 

然後:書面應該工作

$validator = Validator::make($request->all(), [ 
    'array' => ['required', 'array_int', 'exists:users,id'] 
]); 
0

試試這個來檢查你的響應數組是否是json。

return response()->json($yourArr)->setEncodingOptions(JSON_NUMERIC_CHECK);