Я хотел бы вставить идентификатор текущего пользователя в таблицу в столбце «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.
Любая идея или предложение, чего мне не хватает?
Я думаю, что основная проблема здесь в том, что 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.');
}
Мужчина! вы были правы, user_id отсутствовал в $fillable :)
просто используйте методы запроса, такие как
$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. Есть идеи?
Понятно! Если забыл добавить «user_id» в мою модель $fillable! Спасибо за вашу помощь. многому научился!
К сожалению, ваше решение мне не помогло, смотрите мой комментарий выше. Кстати, правилами и проверкой лучше управлять в StoreRequest в методе prepareForValidation().