Php 用laravel 4.2中输入的新值更新/替换值
我们知道laravel有一个update()方法,通过“put”http方法更新记录。除了在我的用户模型中尝试根据静态$rules方法验证新的输入值外,其他一切都很酷。 请看一下我的模型Php 用laravel 4.2中输入的新值更新/替换值,php,validation,laravel,laravel-4,Php,Validation,Laravel,Laravel 4,我们知道laravel有一个update()方法,通过“put”http方法更新记录。除了在我的用户模型中尝试根据静态$rules方法验证新的输入值外,其他一切都很酷。 请看一下我的模型 protected $guarded = ['id', 'admin']; public static $rules = [ 'name' => 'required|min:4', 'username' => 'required|min:3|alpha_num|unique:use
protected $guarded = ['id', 'admin'];
public static $rules = [
'name' => 'required|min:4',
'username' => 'required|min:3|alpha_num|unique:users',
'email' => 'required|email|unique:users',
'password' => 'required|alpha_num|between:5,12|confirmed',
'password_confirmation' => 'required|alpha_num|between:5,12',
'phone' => 'required|min:5|alpha_num',
'city' => 'required|min:2|alpha',
'town' => 'required|min:2|alpha_num',
'address' => 'required|min:5|alpha_num',
'blood' => 'required|min:2',
'img' => 'image|mimes:jpeg,jpg,bmp,png,gif',
'active' => 'integer',
'admin' => 'integer'
];
您可以看到,我已将电子邮件作为用户表的唯一内容。因此,当我尝试更新记录时,如果我更新所有记录以及有效的电子邮件地址,这些记录与登录用户的个人资料信息有关。但如果我保持电子邮件字段不变,它会抛出验证错误,表明电子邮件地址已被占用。
但是我希望laravel只验证更新的字段,这样用户就可以更新任何他们想要的内容,或者保留一两个字段。
有没有办法做到这一点
现在请检查负责更新新输入数据的控制器方法
//update the changes now
public function update($id) {
$user = User::find($id);
$validator = Validator::make(Input::all(), User::$rules);
$input = array_except(Input::all(), ['_method', 'password_confirmation']);
if( $validator->passes() ) {
$user->save($input);
return Redirect::to('donors/'.$user->username.'/profile')
->withMessage('Information Updated');
}
return Redirect::to('donors/'.$user->username.'/profile/edit')
->withMessage('Something went wrong! Please fix the errors.')
->withErrors($validator)
->withInput();
}
为了更清楚地理解该场景,我还添加了表单from view和路由文件片段
路线
视图窗体
{{ Form::open(['url'=>'donors/'.$donor->id, 'method'=>'put', 'role'=>'form']) }}
<table class="table table-bordered donors-table">
<colgroup>
<col class="col-xs-1">
<col class="col-xs-7">
</colgroup>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>
<span class="text-green">Name</span>
</td>
<td>
{{ Form::text('name', $donor->name) }}
<span class="text-red input-error">{{ $errors->first('name') }}</span>
</td>
</tr>
<tr>
<tr>
<td>
<span class="text-green">Email</span>
</td>
<td>
{{ Form::email('email', $donor->email) }}
<span class="text-red input-error">{{ $errors->first('email') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">New Password</span>
</td>
<td>
{{ Form::password('password', null) }}
<span class="text-red input-error">{{ $errors->first('password') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Confirm New Password</span>
</td>
<td>
{{ Form::password('password_confirmation', null) }}
<span class="text-red input-error">{{ $errors->first('password_confirmation') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Blood Group</span>
</td>
<td>
{{ Form::text('blood', $donor->blood) }}
<span class="text-red input-error">{{ $errors->first('blood') }}</span>
</td>
</tr>
<tr>
<tr class="odd">
<td>
<span class="text-green">Address</span>
</td>
<td>
{{ Form::text('address', $donor->address) }}
<span class="text-red input-error">{{ $errors->first('address') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">City</span>
</td>
<td>
{{ Form::text('city', $donor->city) }}
<span class="text-red input-error">{{ $errors->first('city') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Town</span>
</td>
<td>
{{ Form::text('town', $donor->town) }}
<span class="text-red input-error">{{ $errors->first('town') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Phone</span>
</td>
<td>
{{ Form::text('phone', $donor->phone) }}
<span class="text-red input-error">{{ $errors->first('phone') }}</span>
</td>
</tr>
<tr>
</tbody>
</table>
<p class="submit clearfix">
{{ Form::submit('Update', ['class'=>'btn btn-success pull-left']) }}
{{ link_to('donors/'.$donor->username.'/profile', 'Cancel', ['class'=>'pull-right btn btn-danger']) }}
</p>
{{ Form::close() }}
{{Form::open(['url'=>'providers/.$provider->id,'method'=>'put','role'=>'Form'])}
类型
描述
名称
{{Form::text('name',$provider->name)}
{{$errors->first('name')}
电子邮件
{{Form::email('email',$provider->email)}
{{$errors->first('email')}
新密码
{{Form::password('password',null)}
{{$errors->first('password')}
确认新密码
{{Form::password('password_confirmation',null)}
{{$errors->first('password_confirmation')}
血型
{{Form::text('blood',$provider->blood)}
{{$errors->first('blood')}
地址
{{Form::text('address',$provider->address)}
{{$errors->first('address')}
城市
{{Form::text('city',$provider->city)}
{{$errors->first('city')}
城镇
{{Form::text('town',$provider->town)}
{{$errors->first('town')}
电话
{{Form::text('phone',$provider->phone)}
{{$errors->first('phone')}
{{Form::submit('Update',['class'=>'btn btn success pull left'])}
{{link_to('goverators/'.$goverator->username./profile','Cancel',['class'=>'pull-right-btn-btn-danger'])}}
{{Form::close()}}
我错过什么了吗?
让我知道我是否应该显示我的代码的任何其他片段。也可以
$user->update($input);
或
并调整验证规则
'email' => 'unique:users,email_address,10'
其中
10
是当前模型实例的ID。要实现这一点,您需要以某种方式解析规则。对于更新,您需要稍微更改电子邮件规则。如果作为唯一规则的一部分,您将字段传递给检查,然后传递一个值,则不会抱怨该值已被接受
在您的情况下,在进行验证之前,通过放置以下内容来更新控制器:
User::$rules['email'] = 'required|email|unique:users,email,' . Input::get['email'];
您的验证现在应该通过了,因为您已经告诉laravel电子邮件应该是唯一的,但您将接受当前的电子邮件地址。Ops!我忘了提到我已经尝试过update()方法。同样的故事。但是,我还没有尝试fill()方法。我应该试试吗?我认为问题在于验证规则。事实上,电子邮件是唯一的,如果用户不将其更新为新邮件,它将无法验证。我在没有验证检查的情况下进行了尝试,结果成功了。因此,是的,在验证规则中需要更改一些内容。请检查我的验证规则@AndreycoI觉得在追加输入之前需要一个逗号吗?我也有同样的问题,但是对于像“我的名字”这样带有空格的名字,我正在使用4.1并尝试
'campaign\u Name'=>'必需的|唯一的:campaims,Name.(!empty($id)?“,”)”。Input::get('campaign\u Name')。“:”,
,但到目前为止它还不能工作。@Revent你说得对,我漏掉了一个逗号。我已经编辑了我的答案。有人知道你是否必须引用带有空格的值,如my Name
?
'email' => 'unique:users,email_address,10'
User::$rules['email'] = 'required|email|unique:users,email,' . Input::get['email'];