OneToOne Doctrine2 関係の永続化に関連する問題があります。
概要:
UserEntity (プロファイル) と UserDataEntity (ユーザーのデータ) の 2 つのエンティティがあります。各 UserEntity には UserDataEntity がありますが (必須ではありません)、各 UserDataEntity には参照先の UserEntity が必要です。
UserEntity を永続化しようとすると、次のエラーが表示されます。
SQLSTATE[23502]: Not null violation: 7 BŁĄD: pusta wartość w kolumnie "id" narusza ograniczenie wymaganej wartości つまり、ユーザーのテーブルの列 "id" を null にすることはできません。この列には自動生成された主キー戦略が割り当てられているため、紛らわしいです。
以下に私のエンティティがあります:
/**
* 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;
}
}
ユーザーのデータ エンティティ:
/**
* 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;
}
}
私の PostgreSQL データベース スキーマは次のようになります。
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
);
ORMではなく、データベースレベルで制約を維持したいと思います。