'required|array|min:1', 'data.*.nilai_kalori' => 'required' ]; } public function messages(){ return [ 'data.array' => 'Format data harus berupa array', 'data.min' => 'Minimal harus ada satu data klasifikasi menu', 'data.*.nilai_kalori.required' => 'Nilai Kalori Menu wajib diisi', ]; } protected function failedValidation(Validator $validator){ throw new HttpResponseException( response()->json([ 'status' => 'VALIDATION_FAILED', 'message' => 'Validasi Gagal', 'errors' => $validator->errors()->messages(), ], 422) ); } public function withValidator($validator){ $validator->after(function ($validator){ $namaListAsli = collect($this->input('data'))->pluck('nilai_kalori')->filter(); $namaListLower = $namaListAsli->map(fn($n) => strtolower(trim($n))); $duplicates = $namaListLower->duplicates(); if ($duplicates->isNotEmpty()) { foreach ($namaListAsli as $index => $nama) { if ($duplicates->contains(strtolower(trim($nama)))) { $validator->errors()->add("data.$index.nilai_kalori", "Nama '$nama' duplikat dalam input."); } } } $namaList = $namaListAsli->map(fn($n) => strtolower(trim($n))); if($namaList->isEmpty()) return; $exists = DB::connection('dbOrderGizi') ->table('public.kalori') ->where('statusenabled', true) ->whereIn(DB::raw('LOWER(nilai_kalori)'), $namaList->toArray()) ->selectRaw('LOWER(nilai_kalori) as kalori') ->pluck('kalori') ->toArray(); foreach ($namaListAsli as $index => $nama) { $lowerNama = strtolower(trim($nama)); if(in_array($lowerNama, $exists)){ $validator->errors()->add("data.$index.nama_karbohidrat", "Nama '$nama' Sudah digunakan."); } } }); } }