Symfony学说试图插入空主键

时间:2019-01-29 14:08:24

标签: php symfony doctrine-orm

因此,我刚刚开始研究symfony框架,并且一直在努力寻找如何处理数据库中已有关系的方法。为了明确起见,我正在为一个已有的游戏数据库创建一个管理面板,该数据库有些混乱,但是我无法更改此sql服务器数据库中的任何内容,否则游戏会出现问题。

一切正常,直到我尝试将新的寄存器插入数据库。如果删除该关系,它将按预期运行,但是如果保留该关系并尝试注册新用户,则会收到以下消息:

SQLSTATE [23000]:[Microsoft] [用于SQL Server的ODBC驱动程序11] [SQL Server]当IDENTITY_INSERT设置为OFF时,无法在表“用户”中为标识列插入显式值。我还注意到它尝试插入LoginUID,这是我表的自动增量索引键。

用户实体

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;
}

用户身份验证实体:

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;
}

用户实际上并不需要在UserAuth中进行注册,该表用于注册被禁止的用户和游戏管理员,我想建立这种关联,以便可以将用户auth与帐户数据一起获取,以便将其显示在表格中。任何帮助将不胜感激。

编辑:我注意到该问题似乎与JoinColumn批注有关,认为它实际上是试图将dbo.users的UserAuth中的LoginUID加入,是否有任何方法可以防止它发生?我只想使用这种关系来检索用户身份验证。

1 个答案:

答案 0 :(得分:0)

我认为您的UserAuth实体可能有问题。 您的id列名为LoginUID,但是您在One-to-one关系中使用了相同的名称。因此,我认为Doctrine尝试在nickname字段中设置id值。 您只需要绑定UserUserAuth中的一个字段即可。

{
/**
 * @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表中的列ID名称。