У меня две таблицы 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
))
Я буду очень признателен за любую помощь по этому вопросу, я даже отбросил всю схему базы данных и воссоздал ее, как это было предложено в других публикациях, но это тоже не помогло, что мне здесь не хватает?
$ 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);
Других решений пока нет …