Я создал проект с тремя таблицами (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?
Вот изображение моего почтальона, если это поможет:






Вы неправильно читаете ошибку. В нем указано, что аргумент 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), поскольку он анализирует параметры запроса. Это не «волшебный» возврат объектов правильного типа. Вам нужно взять этот идентификатор и получить правильный объект.
Итак, что вам нужно сделать, это следующее:
HardwareUnitType и HardwarePlacement. Это можно сделать путем внедрения зависимостей репозитория непосредственно в действие вашего контроллера «новый». Смотрите документы для получения дополнительной информации. Вы также можете использовать $entityManager, который у вас уже есть, например этот пример из документации, чтобы получить репозиторий.$request->request->get('hardwareUnitTypeId') и $request->request->get('hardwarePlacementId'). Вы должны иметь возможность использовать встроенный в репозиторий метод find (см. предыдущий пример из документации). Вы получите что-то вроде этого:$entity = $repository->find((int) $request->request->get('...'));
$hardwareUnit->setHardwareUnitTypeId($entity)Надеюсь, это поможет вам разобраться в вашей проблеме. Дай мне знать, если тебе еще понадобится помощь!
@hugoschweitzer это не просто имя? Влияет ли это на тип отношения?
@XmlShark Да, это просто имя, вы можете называть свои свойства / геттеры / сеттеры почти так, как хотите, и доктрина сама позаботится о фактическом имени столбца (обратите внимание, что вы можете установить имена столбцов вручную, если хотите). Это просто намного приятнее читать и предотвращает такие ошибки :)
@XmlShark, чтобы предотвратить повторение этой ошибки, я настоятельно рекомендую не указывать «Id» в имени ваших свойств ManyToOne (и то же самое для геттеров/сеттеров), например, $hardwareUnitType вместо $hardwareUnitTypeId.