У меня есть 2 сущности. Сущность Category с 2 колонками: id, caName. Сущность Service с 4 колонками: id, seName, sePrice, caId. Колонка caId в услуге содержит id категории.

Моя цель - сделать createAction, editAction и deleteAction для сервиса. У меня нет проблем с editAction и deleteAction. Однако мой createAction возвращает 500 (внутренняя ошибка сервера).

Запись:

Постигаемая фатальная ошибка: Аргумент 1, переданный в AppBundle\Entity\Service::setCaId() должен быть экземпляром AppBundle\Entity\Category, integer given, вызывается в /Applications/MAMP/htdocs/symfony_luxurysalon/src/AppBundle/Controller/ServiceController.php на строке 67 и определен

Категориальная сущность:

class Category
{
  /**
   * @var int
   *
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\OneToMany(
   *   targetEntity="Service",
   *   mappedBy="caId"
   * )
   */
  private $id;

  ...

  public function __construct()
  {
    $this->id = new ArrayCollection();
  }

  /**
  * Get id
  *
  * @return Service
  */
  public function getId()
  {
     return $this->id;
  }

  ...
}

Сервисная единица:

class Service
{
   ...

  /**
  * @var int
  *
  * @ORM\Column(name="ca_id", type="integer", length=2)
  * @ORM\ManyToOne(targetEntity="Category", inversedBy="id", cascade={"persist","remove"})
  * @ORM\JoinColumn(onDelete="CASCADE")
  */
  private $caId;

  ...

  /**
  * Set caId
  *
  * @param \AppBundle\Entity\Category $caId
  *
  * @return Service
  */
  public function setCaId(\AppBundle\Entity\Category $caId = null)
  {
      $this->caId = $caId;
      return $this;
  }

  /**
  * Get caId
  *
  * @return \AppBundle\Entity\Category
  */
  public function getCaId()
  {
    return $this->caId;
  }
}

Контроллер:

$entity = new Service();
$entity
  ->setSeName("test")
  ->setSePrice("200");
  ->setCaId("2");

$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();

Ответы (1)

Вам нужно передать экземпляр Category вместо id в метод setCaId() (btw. название вводит в заблуждение, если вы не ожидаете передачи id, более подходящим будет что-то вроде setCategory()). Поэтому вам придется сначала найти категорию с id 2 в хранилище, а затем передать эту категорию методу:

$doctrine = $this->getDoctrine();

$category = $doctrine->getRepository('AppBundle:Category')->find(2);

$service = new Service();
$service->setCaId($category);

$em = $doctrine->getManager();
$em->persist($service);
$em->flush();

Возможно, вы захотите добавить некоторую логику для случая, когда find() не возвращает результат (например, когда не существует категории с id 2).

2022 WebDevInsider