【问题标题】:Laravel model: update only one fieldLaravel 模型:只更新一个字段
【发布时间】:2014-05-06 09:06:15
【问题描述】:

我的模型有验证规则:

protected $fillable = array('username','firstname','lastname',"street","city","country","birthday","email");

public static $rules = array(
    'username' => 'required|between:4,16|unique:users',
    'email' => 'required|email|unique:users',
    'password' => 'required|min:4',
    'firstname' => 'required|alpha_num|between:2,16',
    'lastname' => 'required|alpha_num|between:2,32',
);

还有我的更新方法:

public function update($id)
{
    $user = User::find($id);        
    $data = Input::all();       
    if ( isset($data['firstname']) ) {
        $user->firstname = $data['firstname'];
    }

    $success = $user->update();

    if ( $success ) {
        return Response::json(array('error' => false, 'user' => $user->toArray()), 200 );
    } else {
        return Response::json(array('error' => true, 'message' => $user->errors()->all()), 400 );   
    }
}

现在我得到一个错误:

 {
    "error": true,
    "message": [
        "The username has already been taken.",
        "The email has already been taken."
    ]
}

那么,问题是:如何只更新模型的一个字段?

更新:

当我使用 Ardent (https://github.com/laravelbook/ardent) 时,我可以这样做:

$success = $user->updateUniques();

现在一切正常。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    错误消息说在更新模型时,验证唯一需求检测到用户名和电子邮件已经存在。为避免这种情况,请将当前更新的 id 实例附加到 make 验证器。在验证器中使用一个参数来检测您是在更新还是创建它,并在第一种情况下发送用户ID,然后您可以使用:

    强制使用唯一规则以忽略给定 ID

    'username' => 'required|between:4,16|unique:users,'.$userId,
    'email' => 'required|email|unique:users,'.$userId,
    

    更多细节在这里:https://stackoverflow.com/a/22406205/1165509

    【讨论】:

    • 如何追加当前更新的id实例?
    【解决方案2】:
    protected function setConditionalRules($model)
    {
        $id = $model->getKey();
        foreach(['email', 'username'] as $field)
        {
            $this->validator->sometimes($field, $this->rules[$field].",$id", function($input) use($model, $field)
            {
                if($model->exists)
                {
                    $this->validator->setRules(array_except($this->validator->getRules(), [$field]));
                    return true;
                }
                return false;
            });
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 2011-09-04
      • 2014-12-11
      • 1970-01-01
      • 2018-05-25
      • 2013-07-27
      • 2016-10-09
      • 2019-09-15
      • 2014-12-25
      相关资源
      最近更新 更多