Когда я пытался получить доступ к идентификатору модели (JenisSurvey) в методе show JSController, идентификатор всегда был нулевым, даже если модель получена правильно. Интересно, что в моем приложении есть и другие контроллеры, где подобные операции работают прекрасно. Например, если я использую модель User в другом контроллере, я могу без проблем получить доступ к идентификатору.
Я уже проверил конфигурацию маршрута, привязку модели, автозагрузку файлов, логику контроллера, данные с искомым идентификатором существуют в базе данных. Вроде бы всё в порядке, и логика зеркально повторяет логику других контроллеров, где работают подобные операции.
Вот упрощенная версия метода show в JSController:
public function show(JenisSurvey $jenisSurvey)
{
dd($jenisSurvey->id); // This always returns null
if (!$jenisSurvey) {
return response()->json(['error' => 'Data not found.'], 404);
}
return new JSResource($jenisSurvey);
}
Интересно, что в моем приложении есть и другие контроллеры, где подобные операции работают прекрасно. Например, если я использую модель User в другом контроллере (UserController), я могу без проблем получить доступ к идентификатору. Вот упрощенная версия метода show в UserController для сравнения:
public function show(User $user)
{
dd($user->id); // This returns the correct ID
return new UserResource($user);
}
Кроме того, когда я переключаю модель и ресурс в UserController на JenisSurvey, все работает как положено.
// UserController but with jenis survey model and resource
public function show(JenisSurvey $user)
{
dd($user->id); // This returns the correct ID
return new JSResource($user);
}
Вот маршруты:
Route::group(['namespace' => 'App\Http\Controllers', 'middleware' => 'auth:sanctum'],function () {
Route::apiResource('users', UserController::class)->middleware(['auth','verified','role:admin']);
Route::apiResource('js', JSController::class)->middleware(['auth','verified','role:admin|nasabah']);
});
Вот скриншоты ниже.
JSController (контроллер опросов Дженис):
UserController, использующий модель и ресурс пользователя:
UserController, использующий модель и ресурс JenisSurvey:
JSController (var сбрасывает всю модель):
UserController (с моделью и ресурсом Jenis Survey):
Учитывая, что проблема, похоже, специфична для файла JSController (Jenis Survey Controller), я подозреваю, что в его настройке или среде может быть что-то уникальное. Мы будем очень признательны за любые идеи или предложения о том, как устранить эту проблему в дальнейшем.
Получаете ли вы что-нибудь при отладке всей модели, а не только идентификатора dd($jenisSurvey);?
Готово, отредактировано @Luckyfella
попробуйте установить свою базу данных в форме множественного числа, например, если вы используете модель пользователя для «пользователей» базы данных, если вы используете Jenissurvey, попробуйте «jenissurveys». Я сталкиваюсь с той же ошибкой, что и 2 года назад. Я предлагаю не использовать стиль Camel Case для названия модели, если вы хотите абстрагировать идентификатор в модели.
пожалуйста, покажи свой route:list --path=api/js






Не следует предполагать, что имя ресурса будет jenisSurvey, если все, что вы предоставили строителю маршрута ресурса, — это js.
Выполнив быстрый тест L10:
Route::apiResource('js', TestController::class);
php artisan route:list --path=api/js показывает:
GET|HEAD api/js .................... js.index
POST api/js .................... js.store
GET|HEAD api/js/{j} ................ js.show
PUT|PATCH api/js/{j} ................ js.update
DELETE api/js/{j} ................ js.destroy
поэтому ваш ресурс в ваших контроллерах будет называться $j
Если вы хотите сохранить ту же структуру маршрута, вы можете перезаписать автоматически сгенерированное имя в объявлении маршрута.
Route::apiResource('js', TestController::class)->parameter('js', 'jenisSurvey');
Как определяется ваш
api/jsмаршрут? Пожалуйста, отредактируйте свой вопрос и включите также определения маршрутов.