Laravel, как игнорировать (кроме) некоторые поля при обновлении модели с использованием json и laravel - PullRequest
2 голосов
/ 11 января 2020

Функция ниже для обновления информации о пользователе, мне нужно проверить, если электронная почта не дублируется, а также игнорировать пароль, если поле оставлено пустым, я не понимаю, почему эта функция не работает!

public function update(Request $request, $id)
{

$this->validate($request->all(), [
        'fname' => 'required',
        'email' => 'required|email|unique:users,email,'.$id,
        'password' => 'same:confirm-password',
        'roles' => 'required'
    ]);


    $input = $request->all()->except(['country_id', 'region_id']);
    if(!empty($input['password'])){ 
        $input['password'] = Hash::make($input['password']);
    }else{
        $input = array_except($input,array('password'));    
    }

    $user = User::find($id);
    $user->update($input);
    DB::table('model_has_roles')->where('model_id',$id)->delete();
    $user->assignRole($request->input('roles'));
    return response()->json(array('data' => trans('message.success')));
}

Ответы [ 3 ]

1 голос
/ 12 января 2020

Просто удалите все () из запроса в Validate, и это все

0 голосов
/ 11 января 2020

Передайте объект $request, а не $request->all(), который возвращает массив ввода.

$this->validate($request, [
    'fname' => 'required',
    'email' => [
        'required',
        Rule::unique('users')->ignore($id),
    ],
    'password' => 'nullable,confirmed',
    'roles' => 'required'
]);

Я изменил правило пароля, чтобы проверить, существует ли оно, и если оно существует, оно подтверждает, что оно соответствует .

Снова я удалил цепной all() метод

$input = $request->except(['country_id', 'region_id']);
if(!empty($input['password'])){ 
    $input['password'] = Hash::make($input['password']);
}else{
    $input = array_except($input,array('password'));    
}

Не забудьте использовать

use Illuminate\Validation\Rule;
0 голосов
/ 11 января 2020

Во-первых, вам нужно исправить свою проверку.

Вам нужно изменить его на

$request->validate([
        'fname' => 'required',
        'email' => [
           'required',
           'email',
           Rule::unique('users')->ignore($id),
        ],
        'password' => 'same:confirm-password',
        'roles' => 'required'
    ]);

$ request-> all () возвращает массив, вам нужно изменить его на

$input = $request->except(['country_id', 'region_id']);

Также я бы изменил условие для использования встроенного метода Laravel:

if($request->filled('password'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...