Symfony Невозможно вставить запись для двунаправленного отношения onetoOne

У меня две таблицы User а также Survey пользователь может заполнить только один опрос, поэтому отношения, которые я установил между ними, Bidirectional onetoOne

Суть приложения в том, что пользователь должен сначала зарегистрироваться, а затем заполнить анкету, регистрация идет просто отлично.

У меня проблема в том, что когда пользователь пытается сохранить опрос, он получает следующую ошибку

[1/2] PDOException: SQLSTATE [23000]: нарушение ограничения целостности:
1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено
(mv2,mv_survey, ОГРАНИЧЕНИЕ FK_E81A494BBF396750 ИНОСТРАННЫЙ КЛЮЧ
(id) РЕКОМЕНДАЦИИ mv_users (survey_id))

я использую YML и не annotations так вот мой orm.yml файлы для пользователя и опроса

пользователь

UserBundle\Entity\User:
type: entity
table: mv_users
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
username:
type: string
length: 255
name:
type: string
length: 255
email:
type: string
length: 255
unique: true
role:
type: string
length: 255
password:
type: string
length: 255
salt:
type: string
length: 255
nullable: true
isActive:
type: boolean
survey_id:
type: integer
nullable: true
oneToOne:
survey_allias:
targetEntity: XYZBundle\Entity\survey
joinColumn:
name: survey_id
referencedColumnName: id

lifecycleCallbacks: {  }

Опрос

XYZBundle\Entity\survey:
type: entity
table: mv_survey
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
gender:
type: string
length: 255
nullable: true
dob:
type: date
nullable: true
postcode:
type: integer
nullable: true
userID:
type: integer
column: user_id
oneToOne:
user_allias:
targetEntity: UserBundle\Entity\User
inversedBy: survey_allias
joinColumn:
name: id
referencedColumnName: survey_id

lifecycleCallbacks: {  }

Я знаю, что, вероятно, мне следует использовать Fixtures, но просто для проверки того, что все работает внутри контроллера, я делаю это для вставки данных.

$survey = new Survey();
$survey->setGender('Male');
$survey->setDob(new \DateTime());
$survey->setUserID('1');
$manager->persist($survey);
$manager->flush();

Что дает ошибку

[1/2] PDOException: SQLSTATE [23000]: нарушение ограничения целостности:
1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено
(mv2,mv_survey, ОГРАНИЧЕНИЕ FK_E81A494BBF396750 ИНОСТРАННЫЙ КЛЮЧ
(id) РЕКОМЕНДАЦИИ mv_users (survey_id))

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

0

Решение

$ Survey-> setUserID ( ‘1’);

Это плохая практика. Вы должны установить объект напрямую.

Вот как вы должны это сделать:

Пользователь orm.yml

Вам не нужно свойство surveyID ни в вашем orm.yml, ни в вашей сущности.

oneToOne:
survey:
targetEntity: XYZBundle\Entity\survey
mappedBy: user

Пользовательский объект

protected $survey;

public function setSurvey(Survey $survey)
{
$this->survey = $survey;
}

public function getSurvey()
{
return $this->survey;
}

Обзор orm.yml

Вам не нужно свойство userID ни в вашем orm.yml, ни в вашей сущности.

oneToOne:
user:
targetEntity: UserBundle\Entity\User
inversedBy: survey
joinColumn:
name: survey_id
referencedColumnName: id

Survey Entity

protected $user;

public function setUser(User $user)
{
$this->user = $user;
}

public function getUser()
{
return $this->user;
}

Возьмите за привычку позволять Доктрине обрабатывать внешние ключи и прочее. Все ваши сущности, которые нужно реализовать для отношений, являются установщиками / получателями непосредственно для сущностей (не идентификаторов):

$ Entity1-> setEntity2 ($ entity2);

1

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

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

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