Symfony — запросить данные как целое число в реляционную базу данных

Я создал проект с тремя таблицами (hardwarePlacement, HardwareUnitType, hardwareUnit).

И создал для них сущности/контроллеры с get, post, put и delete. И это прекрасно работает, когда я тестирую методы для hardwarePlacement и HardwareUnitType, но последняя таблица «hardwareUnit» является реляционной таблицей для двух других. поэтому у меня есть внешние ключи (hardwarePlacementId и HardwareUnitTypeId).

Поэтому, когда я от почтальона пытаюсь сделать почтовый запрос, я получаю сообщение об ошибке: «что мой setHardwareUnitTypeId и hardwarePlacementId должны быть целочисленного типа».

В моем объекте HardwareUnit у меня есть следующее для других таблиц:

#[ORM\ManyToOne(inversedBy: 'hardwareUnits')]
#[ORM\JoinColumn(nullable: false)]
private ?HardwareUnitType $hardwareUnitTypeId = null;

#[ORM\ManyToOne(inversedBy: 'hardwareUnits')]
#[ORM\JoinColumn(nullable: false)]
private ?HardwarePlacement $hardwarePlacementId = null;

public function getHardwareUnitTypeId(): ?HardwareUnitType
{
    return $this->hardwareUnitTypeId;
}

public function setHardwareUnitTypeId(?HardwareUnitType $hardwareUnitTypeId): self
{
    $this->hardwareUnitTypeId = $hardwareUnitTypeId;

    return $this;
}

public function getHardwarePlacementId(): ?HardwarePlacement
{
    return $this->hardwarePlacementId;
}

public function setHardwarePlacementId(?HardwarePlacement $hardwarePlacementId): self
{
    $this->hardwarePlacementId = $hardwarePlacementId;

    return $this;
}

И мой метод создания в контроллере HardwareUnit:

#[Route('/hardwareUnit', name: 'hardwareUnit_new', methods: ['POST'])]
public function new(ManagerRegistry $doctrine, Request $request): JsonResponse
{
    $entityManager = $doctrine->getManager();

    $hardwareUnit = new HardwareUnit();
    $hardwareUnit->setHardwareUnitTypeId($request->request->get('hardwareUnitTypeId'));
    $hardwareUnit->setHardwarePlacementId($request->request->get('hardwarePlacementId'));
    $hardwareUnit->setName($request->request->get('name'));
    $hardwareUnit->setCreatedDate(new \DateTime());
    $hardwareUnit->setEditedDate(new \DateTime());

    $entityManager->persist($hardwareUnit);
    $entityManager->flush();

    return $this->json('Oprettet ny hardware unit id: ' . $hardwareUnit->getId());
}

Я попытался получить запрос как intval:

$hardwareUnit->setHardwareUnitTypeId($request->request->get(intval('hardwareUnitTypeId')));
$hardwareUnit->setHardwarePlacementId($request->request->get(intval('hardwarePlacementId')));

Но затем я получаю сообщение об ошибке, что значение моего сообщения для setHardwareUnitTypeId и setHardwarePlacementId равно null

Любые предложения о том, как я могу преобразовать свой запрос в int?

Вот изображение моего почтальона, если это поможет:

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы неправильно читаете ошибку. В нем указано, что аргумент setHardwareUnitTypeId должен быть типа HardwareUnitType, но вы предоставляете строку:

App\Entity\HardwareUnit::setHardwareUnitTypeId(): Аргумент №1 ($hardwareUnitTypeId) должен иметь тип ?App\Entity\HardwareUnitType, заданная строка ...

Глядя на ваш код, ошибка совершенно ясна. В вашем маршруте "new" вы вызываете такие функции:

$hardwareUnit->setHardwareUnitTypeId($request->request->get('hardwareUnitTypeId'));
$hardwareUnit->setHardwarePlacementId($request->request->get('hardwarePlacementId'));

Метод $request->request->get()возвращает строку (или int|float|bool|null), поскольку он анализирует параметры запроса. Это не «волшебный» возврат объектов правильного типа. Вам нужно взять этот идентификатор и получить правильный объект.

Итак, что вам нужно сделать, это следующее:

  1. Получите репозиторий для HardwareUnitType и HardwarePlacement. Это можно сделать путем внедрения зависимостей репозитория непосредственно в действие вашего контроллера «новый». Смотрите документы для получения дополнительной информации. Вы также можете использовать $entityManager, который у вас уже есть, например этот пример из документации, чтобы получить репозиторий.
  2. В вашем контроллере используйте репозиторий для получения объекта на основе $request->request->get('hardwareUnitTypeId') и $request->request->get('hardwarePlacementId'). Вы должны иметь возможность использовать встроенный в репозиторий метод find (см. предыдущий пример из документации). Вы получите что-то вроде этого:
$entity = $repository->find((int) $request->request->get('...'));
  1. Используйте результат поиска в качестве аргумента для ваших сеттеров. Основываясь на примере с предыдущим элементом списка: вы получите что-то вроде: $hardwareUnit->setHardwareUnitTypeId($entity)

Надеюсь, это поможет вам разобраться в вашей проблеме. Дай мне знать, если тебе еще понадобится помощь!

@XmlShark, чтобы предотвратить повторение этой ошибки, я настоятельно рекомендую не указывать «Id» в имени ваших свойств ManyToOne (и то же самое для геттеров/сеттеров), например, $hardwareUnitType вместо $hardwareUnitTypeId.

hugo schweitzer 26.01.2023 10:41

@hugoschweitzer это не просто имя? Влияет ли это на тип отношения?

XmlShark 27.01.2023 13:33

@XmlShark Да, это просто имя, вы можете называть свои свойства / геттеры / сеттеры почти так, как хотите, и доктрина сама позаботится о фактическом имени столбца (обратите внимание, что вы можете установить имена столбцов вручную, если хотите). Это просто намного приятнее читать и предотвращает такие ошибки :)

hugo schweitzer 27.01.2023 14:30

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