Laravel 11 — validated() и связанная таблица

Я хотел бы вставить идентификатор текущего пользователя в таблицу в столбце «user_id». Поле является отношением к пользовательской таблице.

Схема миграции/базы данных

        Schema::create('pdlocations', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->decimal('lon', 10, 7);
            $table->decimal('lat', 10, 7);
            $table->string('map'); 
            $table->unsignedBigInteger('user_id'); 
            $table->foreign('user_id')
                ->references('id')
                ->on('users');
        });

В контроллере (PdlocationController.php)

   public function store(PdlocationStoreRequest $request): RedirectResponse
    {
        $request->merge([
            'user_id' => auth()->user()->id,
//            'user_id' => auth()->user(),
        ]);
     
        $this->validate($request, [
            'user_id' => 'required|exists:users,id',
        ]);

        Pdlocation::create($request->validated());
           
        return redirect()->route('admin.pdlocation.index')
                         ->with('success', 'Pdlocation created successfully.');
    }

Если объединить в запрос текущий идентификатор пользователя auth()->user()->id, я получаю следующее сообщение об ошибке:

SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value

insert into
  `pdlocations` (`map`, `lon`, `lat`, `updated_at`, `created_at`)
values
  (test, 66, 55, 2024 -06 -21 18: 42: 57, 2024 -06 -21 18: 42: 57)

Если вместо этого в запрос вливается пользовательский объект auth()->user(), валидатор говорит The selected user id is invalid.

Любая идея или предложение, чего мне не хватает?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, что основная проблема здесь в том, что user_id не существует в атрибуте $fillable внутри модели.
Помимо этого, то, что вы пытаетесь сделать здесь, на самом деле не самое лучшее, вам в любом случае не следует проверять user_id, что вам нужно сделать, это убедиться, что этот маршрут охраняется промежуточным программным обеспечением auth, и поэтому Auth::id() всегда будет содержать действительный идентификатор текущего вошедшего в систему пользователя, который должен быть объединен после проверки.

// make sure this route has the auth middleware
public function store(PdlocationStoreRequest $request): RedirectResponse
    {
        // all the fields including user_id should be in the model's $fillable attribute
        Pdlocation::create([...$request->validated(), 'user_id' => Auth::id()]);
           
        return redirect()->route('admin.pdlocation.index')
                         ->with('success', 'Pdlocation created successfully.');
    }

К сожалению, ваше решение мне не помогло, смотрите мой комментарий выше. Кстати, правилами и проверкой лучше управлять в StoreRequest в методе prepareForValidation().

user25668973 22.06.2024 18:05

Мужчина! вы были правы, user_id отсутствовал в $fillable :)

user25668973 22.06.2024 20:54

просто используйте методы запроса, такие как

$request->validated()

чтобы получить некоторые входные данные, которые вы можете использовать

$request->safe()->only('name')

В Laravel есть правильный способ добавления пользовательских атрибутов при использовании класса Request. Для примера ниже приведен массив правил

public function rules(): array
{
    return [
        'map'=>'required',
        'lon'=>'required',
        'lat'=>'required',
        'user_id' => 'nullable' // It will overwritten by the below method
    ];
}

protected function prepareForValidation(): void
{
    $this->merge([
        'user_id' => auth()->user()?->id
    ]);
}

Итак, теперь у вас есть user_id каждый раз, когда вы используете PdlocationStoreRequest. В контроллере Просто сделайте как

Pdlocation::create($request->validated());
return redirect()->route('admin.pdlocation.index')->with('success', 'Pdlocation created successfully.');

Это поможет вам избавиться от написания повторяющихся кодов.

У меня уже был метод подготовитьForValidation() в моем запросе к магазину, он не работает. Теперь я просмотрел проверенные значения и получил массив с user_id внутри. Но даже в проверенных данных user_id отсутствует в запросе на вставку SQL. Есть идеи?

user25668973 22.06.2024 18:08

Понятно! Если забыл добавить «user_id» в мою модель $fillable! Спасибо за вашу помощь. многому научился!

user25668973 22.06.2024 18:12

Другие вопросы по теме