Как установить непосредственное отношение через идентификаторы между сущностями доктрины

Я надеялся, что это будет простой процесс, но, похоже, Doctrine не очень нравится идея связывать сущности через их идентификаторы.

Все, что я хотел сделать, это нормализовать таблицу, отправив некоторые поля из нее в новую таблицу и вместо добавления нового ссылочного поля в исходную таблицу для хранения идентификатора новой соответствующей записи в, убедитесь, что новая запись в дочерняя таблица будет иметь идентичный идентификатор для своей родительской строки.

Вот пример того, что у меня есть:

пользователь сущность, с аннотированным полем $user ссылаться на идентификатор столбца в UserDetail сущность к самому идентификатору

/**
* @ORM\Table(name="user", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
* @ORM\Entity
*/
class User extends Entity
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id

/**
* @ORM\OneToOne(targetEntity="UserDetail", cascade={"persist"})
* @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=true)
*/
private $userDetail;

...
}

и вот UserDetail его идентификатор @GeneratedValue удален

/**
* @ORM\Table(name="user_detail", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
* @ORM\Entity
*/
class UserDetail extends Entity
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
*/
private $id;

...
}

На данный момент, что я ожидал, чтобы иметь возможность сделать что-то вроде:

$user = new User();
$userDetail = new UserDetail();

$user->setUserDetail($userDetail)

$entityManager->persist($user);
$entityManager->flush();

И получить две записи сохранились до пользователь а также user_detail таблицы с идентичный ID, но реальность такова, что, не имея стратегии, определенной для идентификатора UserDetail, доктрина будет жаловаться на отсутствующий ID, Entity of type UserDetail is missing an assigned ID for field 'id'.

Конечно, это можно сделать вручную и более чем за один звонок

$user = new User();
$entityManager->persist($user);
$entityManager->flush();

$userDetail = new UserDetail();
$userDetail->setId($user->getId)
$user->setUserDetail($userDetail)

$entityManager->persist($user);
$entityManager->flush();

Но я все еще надеюсь, что есть правильная конфигурация (аннотация), которая может помочь мне избежать таких дополнительных шагов и оставить обработку отношения один-к-одному через идентификаторы сущности для Doctrine.

1

Решение

Это не проверено, но я думаю, что следующее может работать, согласно документации (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html):

    /**
* @ORM\Table(name="user_detail", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
* @ORM\Entity
*/
class UserDetail extends Entity
{
/**
* @var integer
*
* @ORM\OneToOne(targetEntity="User")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
* @ORM\Id
*/
private $user;

...
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]