laravel 如何验证laravel中的多条记录插入?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/37881490/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to validate multiple records insertion in laravel?
提问by z3r0ck
My app has a form where I insert multiple records, each record is a new form. I want to validate each field in each form I tried to use validate function but I am confused how to do it for multiple records insert ? For this project I am using laravel 5.2.
我的应用程序有一个表单,我可以在其中插入多条记录,每条记录都是一个新表单。我想验证我尝试使用验证功能的每个表单中的每个字段,但我很困惑如何为多条记录插入?对于这个项目,我使用的是 laravel 5.2。
Store Function For Multiple Insert
多次插入的存储功能
public function store(Request $request)
{
$this->validate($request,[
'name' => 'required|min:4',
'fname' => 'required',
'rollno' => 'required|unique:students'
]);
$input = $request->all();
$condition = $input['name'];
foreach ($condition as $key => $condition) {
$student = new Student;
$student->name = $input['name'][$key];
$student->fname = $input['fname'][$key];
$student->rollno = $input['rollno'][$key];
$student->obtainedmarks = $input['obtainedmarks'][$key];
$student->totalmarks = $input['totalmarks'][$key];
$student->percentage = $input['percentage'][$key];
$student->save();
}
return Redirect::to('/allresults');
}
View For Inserting data
查看插入数据
@extends('layouts.app')
@section('content')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$('.add').click(function () {
var n = ($('.resultbody tr').length - 0) + 1;
var tr = '<tr><td class="no">' + n + '</td>' +
'<td><input type="text" class="name form-control" name="name[]" value="{{ old('name') }}"></td>'+
'<td><input type="text" class="fname form-control" name="fname[]" value="{{ old('fname') }}"></td>'+
'<td><input type="text" class="rollno form-control" name="rollno[]" value="{{ old('rollno') }}"></td>'+
'<td><input type="text" class="obtainedmarks form-control" name="obtainedmarks[]" value="{{ old('email') }}"></td>'+
'<td><input type="text" class="totalmarks form-control" name="totalmarks[]"></td>'+
'<td><input type="text" class="percentage form-control" name="percentage[]"></td>'+
'<td><input type="button" class="btn btn-danger delete" value="x"></td></tr>';
$('.resultbody').append(tr);
});
$('.resultbody').delegate('.delete', 'click', function () {
$(this).parent().parent().remove();
});
$('.resultbody').delegate('.obtainedmarks , .totalmarks', 'keyup', function () {
var tr = $(this).parent().parent();
var obtainedmarks = tr.find('.obtainedmarks').val() - 0;
var totalmarks = tr.find('.totalmarks').val() - 0;
var percentage = (obtainedmarks / totalmarks) * 100;
tr.find('.percentage').val(percentage);
});
});
</script>
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">Add Results</div>
@if(count($errors) >0 )
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
@endif
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/result') }}">
{!! csrf_field() !!}
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Student Name</th>
<th>Father Name</th>
<th>Roll No</th>
<th>Obtained Marks</th>
<th>Total Marks</th>
<th>%</th>
<th>Delete</th>
</tr>
</thead>
<tbody class="resultbody">
<tr>
<td class="no">1</td>
<td>
<input type="text" class="name form-control" name="name[]" value="{{ old('name') }}">
</td>
<td>
<input type="text" class="fname form-control" name="fname[]" value="{{ old('fname') }}">
</td>
<td>
<input type="text" class="rollno form-control" name="rollno[]" value="{{ old('rollno') }}">
</td>
<td>
<input type="text" class="obtainedmarks form-control" name="obtainedmarks[]" value="{{ old('email') }}">
</td>
<td>
<input type="text" class="totalmarks form-control" name="totalmarks[]">
</td>
<td>
<input type="text" class="percentage form-control" name="percentage[]">
</td>
<td>
<input type="button" class="btn btn-danger delete" value="x">
</td>
</tr>
</tbody>
</table>
<center><input type="button" class="btn btn-lg btn-primary add" value="Add New Item">
<input type="submit" class="btn btn-lg btn-default" value="Submit"></center>
</form>
</div>
</div>
</div>
</div><!-- First Row End -->
</div> <!-- Container End -->
@endsection
Update :In the view you will notice there is a button when the user click on that "add new" it adds new row row I want to validate all the rows, each row contains a record.
采纳答案by Iftikhar uddin
Laravel 5.2 comes with bundle of ready features, for array validations you can take a look on Validating Arrays
Laravel 5.2 附带了一系列现成的功能,对于数组验证,您可以查看Validating Arrays
In your case you should try :
在您的情况下,您应该尝试:
$validator = \Validator::make($request->all(), [
'name.*' => 'yourRules',
'fname.*' => 'yourRules',
'rollno.*' => 'yourRules',
'obtainedmarks.*' => 'yourRules',
'totalmarks.*' => 'yourRules'
]);
if($validator->fails()) {
return back()->withInput()->withErrors($validator->errors());
}
Another Solution:
另一个解决方案:
The above solution is perfect and latest one, specially for Laravel 5.2 users. You can also try
上面的解决方案是完美的最新解决方案,专门针对 Laravel 5.2 用户。你也可以试试
$validator = \Validator::make($request->all(), [
'name' => 'array',
//and your other rules here
]);
After that use Validator each
method to apply your defined rules to each element of the array.
之后,使用 Validatoreach
方法将您定义的规则应用于数组的每个元素。
$validator->each('name','yourRule');
回答by z3r0ck
I think you can do this to validate your array input.
我认为您可以这样做来验证您的数组输入。
'input_name.*' => 'rules'
https://laravel.com/docs/5.2/validation#validating-arrays
https://laravel.com/docs/5.2/validation#validating-arrays
So in your case this:
所以在你的情况下:
$this->validate($request,[
'name.*' => 'required|min:4',
'fname.*' => 'required',
'rollno.*' => 'required|unique:students'
]);
回答by Qevo
Form input arrays make things a little more complicated. You are making mistakes on various levels:
表单输入数组让事情变得有点复杂。你在不同层面犯错:
- Not accounting for row index position.
- Blade renders only one row when there may be more.
- Blade syntax in javascript will never work.
- Never calling your validator.
- Saving valid records without considering that you may have to return the user if one of the records is invalid.
- Choosing to return only invalid rows adds some more work but can be done.
- 不考虑行索引位置。
- 当可能有更多行时,Blade 仅渲染一行。
- javascript 中的 Blade 语法永远不会起作用。
- 永远不要调用你的验证器。
- 保存有效记录而不考虑如果记录之一无效,您可能必须返回用户。
- 选择仅返回无效行会增加一些工作,但可以完成。
Try the following as a start point. I didn't have time to test this all now but it follows logic I have successfully used many times.
请尝试以下操作作为起点。我现在没有时间测试这一切,但它遵循我已成功使用多次的逻辑。
view
看法
@extends('layouts.app')
@section('content')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$('.add').click(function () {
var n = $('.resultbody tr').length - 0;
var n_adj = n + 1;
var tr = '<tr><td class="no">' + n_adj + '</td>' +
'<td><input type="text" class="name form-control" name="name[n]" value=""></td>'+
'<td><input type="text" class="fname form-control" name="fname[n]" value=""></td>'+
'<td><input type="text" class="rollno form-control" name="rollno[n]" value=""></td>'+
'<td><input type="text" class="obtainedmarks form-control" name="obtainedmarks[n]" value=""></td>'+
'<td><input type="text" class="totalmarks form-control" name="totalmarks[n]"></td>'+
'<td><input type="text" class="percentage form-control" name="percentage[n]"></td>'+
'<td><input type="button" class="btn btn-danger delete" value="x"></td></tr>';
$('.resultbody').append(tr);
});
$('.resultbody').delegate('.delete', 'click', function () {
$(this).parent().parent().remove();
});
$('.resultbody').delegate('.obtainedmarks , .totalmarks', 'keyup', function () {
var tr = $(this).parent().parent();
var obtainedmarks = tr.find('.obtainedmarks').val() - 0;
var totalmarks = tr.find('.totalmarks').val() - 0;
var percentage = (obtainedmarks / totalmarks) * 100;
tr.find('.percentage').val(percentage);
});
});
</script>
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">Add Results</div>
@if(count($errors) >0 )
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
@endif
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/result') }}">
{!! csrf_field() !!}
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Student Name</th>
<th>Father Name</th>
<th>Roll No</th>
<th>Obtained Marks</th>
<th>Total Marks</th>
<th>%</th>
<th>Delete</th>
</tr>
</thead>
<tbody class="resultbody">
@for ($i = 0; $i < isset($row_count) ? $row_count : 1; $i++)
<tr>
<td class="no">{{ $i+1 }}</td>
<td>
<input type="text" class="name form-control" name="name[]" value="{{ old('name['.$i.']', null) }}">
</td>
<td>
<input type="text" class="fname form-control" name="fname[]" value="{{ old('fname['.$i.']', null) }}">
</td>
<td>
<input type="text" class="rollno form-control" name="rollno[]" value="{{ old('rollno['.$i.']', null) }}">
</td>
<td>
<input type="text" class="obtainedmarks form-control" name="obtainedmarks[]" value="{{ old('obtainedmarks['.$i.']', null) }}">
</td>
<td>
<input type="text" class="totalmarks form-control" name="totalmarks[]" value="{{ old('totalmarks['.$i.']', null) }}">
</td>
<td>
<input type="text" class="percentage form-control" name="percentage[]" value="{{ old('percentage['.$i.']', null) }}">
</td>
<td>
<input type="button" class="btn btn-danger delete" value="x">
</td>
</tr>
@endfor
</tbody>
</table>
<center><input type="button" class="btn btn-lg btn-primary add" value="Add New Item">
<input type="submit" class="btn btn-lg btn-default" value="Submit"></center>
</form>
</div>
</div>
</div>
</div><!-- First Row End -->
</div> <!-- Container End -->
@endsection
store()
店铺()
use Validator;
// ...
public function store(Request $request)
{
$validation_rules = [
'name' => 'required|min:4',
'fname' => 'required',
'rollno' => 'required|unique:students'
];
$validation_messages = [
// add custom error messages
];
$name = $request->input('name');
$fname = $request->input('fname');
$rollno = $request->input('rollno');
$obtainedmarks = $request->input('obtainedmarks');
$totalmarks = $request->input('totalmarks');
$percentage = $request->input('percentage');
// number of rows submitted (use a required value)
$n = count($names);
// track valid student records
$students = [];
for ($i=0; $i < $n; $i++) {
$data = [
'name' => $name[$i],
'fname' => $fname[$i],
'rollno' => $rollno[$i],
'obtainedmarks' => $obtainedmarks[$i],
'totalmarks' => $totalmarks[$i],
'percentage' => $percentage[$i]
];
$validator = Validator::make($data, $validation_rules, $validation_messages);
if ($validator->fails()) {
// redirect back to form
return redirect()->back()->withInput($request->all())->with('errors', '$validator->errors());
}
$students[] = $data;
}
foreach ($students as $row) {
Student::create($row);
}
return redirect('/allresults');
}
回答by nemonake
$failed = false;
$errors = [];
foreach($data['name'] as $key => $val){
$v = Validator::make($val, [
'name' => 'unique:users'
]);
if ($validator->fails()) {
$failed = true;
$error = [
'msg' => $v->errors()->all(),
'number' => $val['name'],
];
array_push($errors, $error);
}
}
if($failed == true){
return['msg' => false, 'data' => $errors];
}
Try this one :)
试试这个:)