В Symfony 3 с Doctrine я пытаюсь получить одностороннее однонаправленное отношение к обеим таблицам, использующим один и тот же первичный ключ. Для этого я пытаюсь воспроизвести пример на странице « Сопоставление ссылок на доктрину» .
Тем не менее, индивидуальная документация uni не имеет примеров сеттеров и геттеров – и также нет определения поля id на целевом объекте. Поэтому я попытался экспериментировать вокруг себя.
Это мои сущности:
class Country { /** * @var integer * * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"}) * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=true) */ private $mysubentity; [...] /** * @return MySubEntity */ public function getMySubEntity() { return $this->mysubentity; } /** * @param MySubEntity $mysubentity */ public function setMySubEntity($mysubentity) { $this->mysubentity = $mysubentity; } } class MySubEntity { /** * @var integer * * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; [..] /** * Set id * * @param $id * * @return MySubEntity */ public function setId($id) { $this->id = $id; return $this; } /** * Get id * * @return int */ public function getId() { return $this->id; } }
Когда я сохраняю объект страны, я получаю Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
. При проверке данных я вижу, что Doctrine попыталась установить id MySubEntity равным 0.
Кто-нибудь знает, что мне нужно сделать для того, чтобы поле MySubEntity $ id было автоматически заполнено из страны страны?
Вам нужно изменить свойство name JoinColumn на что-либо еще, но не на id:
/** * @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"}) * @ORM\JoinColumn(name="mysubentity_id", referencedColumnName="id", nullable=true) */ private $mysubentity;
Что это делает: JoinColumn сообщает доктрине, в которой столбец базы данных сохраняет отношение. поэтому, если вы назовёте его mysub_id, ваш основной объект будет иметь столбец с таким именем, в котором значение ссылочной точки будет сохранено (id вашего субэйнтита).
Если вы говорите, что имя JoinColumn – это идентификатор, который уже используется первичным ключом вашего объекта, у вас конфликт.
Редактировать:
Я пропустил вашу точку с использованием одного и того же первичного ключа. Есть ли какая-то конкретная причина для этого? Но если вам действительно нужно сделать это по унаследованным причинам, посмотрите на
или возможность генерировать значение первичного ключа вашего субЭффекта самостоятельно, изменяя стратегию генерации (NONE или custom в этом случае)