Сохранить идентификатор зарегистрированного пользователя в базе данных, когда у меня есть $request-> all()

#php #laravel

#php #laravel

Вопрос:

Я хочу сохранить новое сообщение из формы в своей базе данных, у меня есть заголовок и тело в $request и я хочу сохранить идентификатор зарегистрированного пользователя в сообщении. как я могу справиться с этим в модели или проверке?

     Validator::make($request->all(), [
        'title' => ['required'],
        'body' => ['required'],
    ])->validate();
    Post::create($request->all());
 

Я могу сохранить его, как показано ниже:

 $post = new Flight;
$post->title = $request->title;
$post->body = $request->body;
$post->user_id = $request->user()->id;
$post->save();
 

но я хочу лучший способ.

  • идентификатор пользователя не обнуляется в БД

Комментарии:

1. В чем проблема, что бы вы ни сделали, выглядит правильно.

2. $request->user()->id это дает вам аутентифицированного зарегистрированного пользователя, так в чем же проблема?

3. Я хочу обработать это в модели или проверке, а в коде контроллера просто есть Post::create($request-> all());. Фактически то же самое, что и временные метки, которые Laravel обрабатывает сам или значение по умолчанию для полей, я тоже хочу справиться с этим

4. Одна вещь, которую нужно понять $request->all() , дает вам массив ваших входных данных формы с именами. Если у вас нет никаких входных данных в вашей форме user_id , вы просто не получите их $request . Либо определите этот ввод, либо продолжайте делать то, что вы уже сделали. Подход, показанный @Muddassir, также является хорошим способом получения идентификатора пользователя, прошедшего проверку подлинности.

5. Да, я знаю о формах и запросах, я хочу обрабатывать это автоматически. Например, если добавить защищенные $attributes = [‘user_id’ => 1, ]; , номер 1 всегда сохраняется для user_id , теперь я хочу идентификатор пользователя вместо номера 1

Ответ №1:

Вот пример кода, который я всегда использую.

 use IlluminateHttpJsonResponse;
use IlluminateHttpResponse;    
...

public function store(Request $request)
{
   // take only fields that have been validated.
   // instead of inserting all the request body
   $validated = $request->validate([
      'title' => 'required',
      'body' => 'required'
   ]);

   // use FormRequest if want seperate validation and its much cleaner
   // something like this
   // store(StorePostRequest $request)
   //   $validated = $request->validated();

   // instead of declaring use Auth
   // u can just use $request->user();
   $post = $request->user()->post()->create($validated);

   // or if you dont have the relation inside the user model
   $post = Post::create(['user_id' => auth()->id()]   $validated);

   return new JsonResponse($post, Response::HTTP_CREATED);
}
 

Комментарии:

1. $post = Post::create([‘user_id’ => auth()-> id()] $validated); это не сработало для меня. но тот, который основан на отношении, был в порядке, спасибо

Ответ №2:

Включите фасад аутентификации в заголовок контроллера use Auth; , чем вы можете использовать $post->user_id = Auth::id();

вы можете использовать оба Auth::user()->id или Auth::id() . Спасибо

Ответ №3:

Вы можете использовать проверку запроса формы для извлечения логина проверки из контроллера (см. Документацию).

Я бы предложил использовать $request->validated() метод вместо $request->all() того, чтобы убедиться, что в модель передаются только ожидаемые поля.

Кроме того, вы можете использовать auth()->id() вспомогательный метод для получения идентификатора пользователя, вошедшего в систему.

Итак, функция контроллера может быть следующей:

 Post::create(array_merge($request->validated(), ['user_id' => auth()->id()]));