Вставка доктрины в таблицу БД Oracle 12c с автоматически генерируемым идентификатором - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь вставить в свою таблицу базы данных (Oracle 12c) новую запись, но мне не удается это сделать

Следующее является моей сущностью:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Divisions
 *
 * @ORM\Table(name="DIVISIONS")
 * @ORM\Entity
 */
class Divisions
{

    /**
     * @var int
     *
     * @ORM\Column(name="DIVISIONID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="DIVISIONS_DIVISIONID_seq", allocationSize=1, initialValue=1)
     */
    public $divisionid = '"SPECIFICATIONS"."ISEQ$$_79111".nextval';

    /**
     * @var string|null
     *
     * @ORM\Column(name="DIVISIONNAME", type="string", length=500, nullable=true)
     */
    public $divisionname;

    /**
     * @var int|null
     *
     * @ORM\Column(name="SORTORDER", type="integer", nullable=true, options={"default"="1"})
     */
    public $sortorder = '1';

    /**
     * @var int|null
     *
     * @ORM\Column(name="ISDELETED", type="integer", nullable=true)
     */
    public $isdeleted = '0';

    public function getDivisionid(): ?int
    {
        return $this->divisionid;
    }

    public function getDivisionname(): ?string
    {
        return $this->divisionname;
    }

    public function setDivisionname(?string $divisionname): self
    {
        $this->divisionname = $divisionname;

        return $this;
    }

    public function getSortorder(): ?int
    {
        return $this->sortorder;
    }

    public function setSortorder(?int $sortorder): self
    {
        $this->sortorder = $sortorder;

        return $this;
    }

    public function getIsdeleted(): ?int
    {
        return $this->isdeleted;
    }

    public function setIsdeleted(?int $isdeleted): self
    {
        $this->isdeleted = $isdeleted;

        return $this;
    }


}

А вот мой контроллеркоторый пытается "POST" и добавить новый Отдел

<?php

namespace App\Controller;

use App\Entity\Divisions;
use App\Form\DivisionsType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * @Route("api/divisions")
 */
class DivisionsController extends AbstractController
{

    /**
     * @Route("", name="divisions_add", methods={"POST"})
     */
    public function addDivisions(Request $request)
    {
      $em = $this->getDoctrine()->getManager();
      $division = new Divisions();
      $division->setDivisionname('TestDiv');
      $em->persist($division);
      $em->flush();
      return new Response(
        Response::HTTP_OK
      );
    }


}

, когда я пытаюсь вызвать это, появится следующее сообщение об ошибке:

An exception occurred while executing 'INSERT INTO DIVISIONS (DIVISIONID, DIVISIONNAME, SORTORDER, ISDELETED) VALUES (?, ?, ?, ?)' with params [16, "TestDiv", "1", "0"]:

ORA-32795: cannot insert into a generated always identity column

По какой-то причине, независимо от того, что япопробуйте вызвать столбец DivisionID .. есть ли способ вставить без вызова некоторых определенных столбцов?

Или есть способ отправить его как 'INSERT INTO DIVISIONS (DIVISIONNAME, SORTORDER, ISDELETED) VALUES (?,?,?) 'с параметрами ["TestDiv", "1", "0"]'

PS: объект автоматически генерируется из базы данных

Если кто-то хочет, чтобы больше информации я с радостью предоставил

1 Ответ

0 голосов
/ 17 октября 2018

Хорошо, так что, если кто-то достигнет этой точки и все еще застрянет, я найду какую-то работу вокруг:

Я изменил свою сущность так:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Divisions
 *
 * @ORM\Table(name="DIVISIONS")
 * @ORM\Entity
 */
class Divisions
{
    /**
     * @var int
     *
     * @ORM\Column(name="DIVISIONID", type="integer", nullable=false)
     * @ORM\Id
     */
    public $divisionid;

    /**
     * @var string|null
     *
     * @ORM\Column(name="DIVISIONNAME", type="string", length=500, nullable=true)
     */
    public $divisionname;

    /**
     * @var int|null
     *
     * @ORM\Column(name="SORTORDER", type="integer", nullable=true, options={"default"="1"})
     */
    public $sortorder = '1';

    /**
     * @var int|null
     *
     * @ORM\Column(name="ISDELETED", type="integer", nullable=true)
     */
    public $isdeleted = '0';

    public function getDivisionid(): ?int
    {
        return $this->divisionid;
    }

    public function getDivisionname(): ?string
    {
        return $this->divisionname;
    }

    public function setDivisionname(?string $divisionname): self
    {
        $this->divisionname = $divisionname;

        return $this;
    }

    public function getSortorder(): ?int
    {
        return $this->sortorder;
    }

    public function setSortorder(?int $sortorder): self
    {
        $this->sortorder = $sortorder;

        return $this;
    }

    public function getIsdeleted(): ?int
    {
        return $this->isdeleted;
    }

    public function setIsdeleted(?int $isdeleted): self
    {
        $this->isdeleted = $isdeleted;

        return $this;
    }


}

Затем в контроллерея добавил следующую функцию:

private function getMaxDivisionIdNumber() {
  $em = $this->getDoctrine()->getManager();
  $query = $em->createQuery('SELECT MAX(u.divisionid) FROM App\Entity\Divisions u');
  $res = $query->getResult();
  return $res[0][1];
}

Теперь эта функция используется для получения максимального идентификатора ... поэтому мой контроллер будет выглядеть примерно так:

<?php

namespace App\Controller;

use App\Entity\Divisions;
use App\Form\DivisionsType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * @Route("api/divisions")
 */
class DivisionsController extends AbstractController
{

    /**
     * @Route("", name="divisions_add", methods={"POST"})
     */
    public function addDivisions(Request $request)
    {
      $em = $this->getDoctrine()->getManager();
      $content = $request->getContent();
      $content = json_decode($content);
      $division = new Divisions();
      foreach ($content as $key => $value) {
        $division->$key = $value; 
      }
      $maxId = (int) $this->getMaxDivisionIdNumber();
      $division->divisionid = $maxId + 1;
      $em->persist($division);
      $em->flush();
      return new Response(
        Response::HTTP_OK
      );
    }

   private function getMaxDivisionIdNumber() {
    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery('SELECT MAX(u.divisionid) FROM App\Entity\Divisions u');
    $res = $query->getResult();
    return $res[0][1];
   }

}
...