【问题标题】:Update/replace value with new values inputted in laravel 4.2用 laravel 4.2 中输入的新值更新/替换值
【发布时间】:2014-08-02 22:25:27
【问题描述】:

我们知道 laravel 有一个 update() 方法,通过“put”http 方法更新记录。一切都很正常,除非我尝试针对我的用户模型中的静态 $rules 方法验证新输入值。 请看看我的模型

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'
];

您看到我已将电子邮件设置为 user 表的唯一性。因此,当我尝试更新有关登录用户个人资料信息的记录时,如果我更新所有记录以及电子邮件地址,它就可以工作。但是,如果我将电子邮件字段保持原样,则会引发验证错误,说明电子邮件地址已被占用。 但我希望 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();  
}

为了更清楚地理解场景,我也添加了视图表单和路由文件sn-p。

路线

Route::put('donors/{id}', ['uses'=>'DonorsController@update']);

查看表单

            {{ 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() }}

请问我有什么遗漏吗? 让我知道是否应该显示我的代码的任何其他 sn-p。

【问题讨论】:

    标签: php validation laravel laravel-4


    【解决方案1】:

    为了更新,您需要稍微更改电子邮件规则。如果作为唯一规则的一部分,您将字段传递给检查,然后传递一个值,它不会抱怨该值已被采用。

    在您的情况下,通过在您进行验证之前放置以下内容来更新您的控制器:

    User::$rules['email'] = 'required|email|unique:users,email,' . Input::get['email'];
    

    您的验证现在应该通过了,因为您告诉 laravel 电子邮件应该是唯一的,但您将接受当前的电子邮件地址。

    【讨论】:

    • 我认为您在附加输入之前需要一个逗号?我有同样的问题,但名称中带有“我的名字”之类的空格,我正在使用 4.1 并尝试使用 'campaign_name' =&gt; 'required|unique:campaigns,name'.(!empty($id) ? ",'".Input::get('campaign_name')."'" : ''),,但到目前为止它不起作用。
    • @Revent 你说得对,我错过了一个逗号。我已经编辑了我的答案。
    • 有谁知道您是否必须用My Name 之类的空格引用值?
    【解决方案2】:

    随便

    $user->update($input);
    

    // this is exactly what `update()` method does.
    $user->fill($input)->save();
    

    同时调整验证规则

    'email' => 'unique:users,email_address,10'
    

    10 是当前模型实例的 ID。为此,您需要以某种方式解析规则。

    【讨论】:

    • 操作!我忘了提到我已经尝试过 update() 方法。相同的故事。还没有尝试过 fill() 方法。我应该试试吗?我认为问题出在验证规则上。电子邮件是唯一的这一事实,它无法验证用户是否不将其更新为新电子邮件。我在没有验证检查的情况下尝试过,它有效。所以是的,需要在验证规则中进行一些更改。请检查我的验证规则。 @Andreyco
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2021-07-11
    • 2015-12-17
    • 2020-10-02
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多