Доктрина Symfony пытается вставить нулевой первичный ключ - PullRequest
0 голосов
/ 29 января 2019

Итак, я только начал изучать фреймворк Symfony и изо всех сил пытался понять, как работать с некоторыми отношениями, которые у меня есть в моей базе данных.Чтобы уточнить, я делаю панель администратора для уже существующей игровой базы данных, которая в некотором роде испорчена, но я не могу ничего изменить в этой базе данных сервера SQL, иначе у игры будут проблемы.

все работает отлично, пока я не попытаюсь вставить новый регистр в базу данных.Если я удаляю связь, она работает как положено, но если я сохраняю ее и пытаюсь зарегистрировать нового пользователя, я получаю следующее сообщение:

SQLSTATE [23000]: [Microsoft] [Драйвер ODBC 11 для SQLСервер] [SQL Server] Невозможно вставить явное значение для столбца идентификаторов в таблице «пользователи», если для параметра IDENTITY_INSERT установлено значение OFF.Я также замечаю, что он пытается вставить LoginUID, который является индексным ключом автоинкремента в моей таблице.

User Entity

class Users
{
/**
 * @var int
 *
 * @ORM\Column(name="LoginUID", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="login", type="string", length=255)
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(name="email", type="string", length=255)
 */
private $email;

/**
 * @var string
 *
 * @ORM\Column(name="Connecting", type="integer")
 */
private $connecting;

/**
 * @var string
 *
 * @ORM\Column(name="passwd", type="string", length=255)
 */
private $password;

/**
 * @var integer
 *
 * @ORM\Column(name="sex", type="integer")
 */
private $sex;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="firstlogin", type="datetime")
 */
private $firstlogin;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="lastlogin", type="datetime")
 */
private $lastlogin;

/**
 * @ORM\OneToOne(targetEntity="UserAuth", fetch="EAGER")
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID")
 */
private $userAuth = null;

/**
 *
 * @ORM\OneToOne(targetEntity="UserNickname", fetch="EAGER")
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID")
 */
private $nickname = null;

/**
 * Get Id
 *
 * @return int
 */
public function getId()
{
    return $this->id;
}

User Auth Entity:

class UserAuth
{
/**
 * @var int
 *
 * @ORM\Column(name="LoginUID", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var int
 *
 * @ORM\Column(name="AuthLevel", type="integer")
 *
 * @ORM\OneToOne(targetEntity="Users")
 *
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID")
 */
private $authLevel;

/**
 * @var bool
 *
 * @ORM\Column(name="IsReset", type="boolean")
 */
private $isReset;

/**
 *
 * @ORM\OneToOne(targetEntity="UserNickname", fetch="EAGER")
 *
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID")
 */
private $nickname;

/**
 *
 * @ORM\OneToOne(targetEntity="UserAuthDate", fetch="EAGER")
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID")
 */
private $limitDate;

/**
 * Get id
 *
 * @return int
 */
public function getId()
{
    return $this->id;
}

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

Редактировать: Я заметил, что проблема, похоже, связана с аннотацией JoinColumn, полагая, что она на самом деле пытается объединить LoginUID из UserAuth с dbo.users,Есть ли способ предотвратить это?Я просто хочу использовать это отношение для получения аутентификации пользователя.

1 Ответ

0 голосов
/ 29 января 2019

Я думаю, что у вас может быть проблема в вашей UserAuth сущности.Ваш столбец id называется LoginUID, но вы используете то же имя в вашем One-to-one отношении.Поэтому я думаю, что Doctrine пытается установить значение nickname, например, в поле id.Вам нужно только связать одно поле из User в UserAuth.

{
/**
 * @var int
 * @ORM\Id
 * @ORM\OneToOne(targetEntity="Users", fetch="EAGER")
 * @ORM\JoinColumn(name="LoginUID", referencedColumnName="LoginUID") //from User
 */
private $id;

/**
 *
 * @ORM\Column(name="nickname")
 */
private $nickname;

РЕДАКТИРОВАТЬ: я изменил свойство id.Это может работать, свойство name JoinColumn должно ссылаться на имя идентификатора столбца в вашей таблице UserAuth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...