Czołem!
Napotałem na problem z zapisaniem entity Doctrine2 w relacji OneToOne.
Opis problemu:
Posiadam dwie encje: UserEntity (użytkownik) oraz UserDataEntity (dane o użytkowniku). Każdy UserEntity
może posiadać UserDataEntity (ale nie jest to wymagane gdy nie podano danych), ale każdy UserDataEntity musi mieć UserEntity, którego dotyczy.
Kiedy próbuję zapisać UserEntity, otrzymuję komunikat z PostgreSQL:
> SQLSTATE[23502]: Not null violation: 7 BŁĄD: pusta wartość w kolumnie "id" narusza ograniczenie wymaganej wartości
Poniżej moje encje:
<?php
/**
* A user.
*
* @ORM\Entity
* @ORM\Table(name="users")
*/
class UserEntity extends AbstractEntity
{
/**
* @ORM\Id
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $name;
/**
* @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanDataEntity", inversedBy="parent", cascade={"persist"})
* @ORM\JoinColumn(name="id", referencedColumnName="data_id")
*/
protected $data;
public function setData(UserDataEntity $data)
{
$this->data = $data;
}
}
I dane użytkownika:
<?php
/**
* A user's data.
*
* @ORM\Entity
* @ORM\Table(name="users_data")
*/
class UserDataEntity extends AbstractEntity
{
/**
* @ORM\Id
* @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanEntity", mappedBy="parent", cascade={"persist"})
* @ORM\JoinColumn(name="data_id", referencedColumnName="id")
*/
protected $parent;
/**
* @ORM\Column(type="string")
*/
protected $email;
/**
* @ORM\Column(type="string")
*/
protected $phone;
/**
* Provides creation for new empty entity.
*
*/
public function __construct(TradesmanEntity $parent)
{
$this->parent = $parent;
}
}
Moja schema wygląda tak:
CREATE TABLE users
(
id serial NOT NULL,
name character varying(255) NOT NULL,
CONSTRAINT users_pkey PRIMARY KEY (id )
);
CREATE TABLE users_data
(
data_id integer NOT NULL,
email character varying(255) NOT NULL,
phone character varying NOT NULL,
CONSTRAINT users_data_pkey PRIMARY KEY (data_id ),
CONSTRAINT users_data_data_id_fkey FOREIGN KEY (data_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE CASCADE
);
Chciałbym zachować integralność bazy danych i ogarnienia na poziomie bazy danych, nie ORM'a.