【问题标题】:Symfony doctrine trying to insert a null primary keySymfony 教义试图插入一个空主键
【发布时间】:2019-01-30 16:05:19
【问题描述】:

所以,我刚开始研究 symfony 框架,我一直在努力弄清楚如何处理我数据库中的一些关系。澄清一下,我正在为一个已经存在的游戏数据库创建一个管理面板,这有点搞砸了,但我无法更改这个 sql server 数据库中的任何内容,否则游戏会出现问题。

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

SQLSTATE[23000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]当 IDENTITY_INSERT 设置为 OFF 时,无法在表“users”中插入标识列的显式值。我还注意到它尝试插入 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中注册,该表用于注册被禁止的用户和游戏大师,我想建立这种关联,以便我可以将用户身份验证与帐户数据一起获取,以便将其显示在表格中。任何帮助将不胜感激。

编辑:我注意到问题似乎出在 JoinColumn 注释上,认为它实际上是在尝试使用 dbo.users 从 UserAuth 加入 LoginUID,有什么办法可以防止它发生?我只是想使用这个关系来检索用户身份验证。

【问题讨论】:

标签: php symfony doctrine-orm


【解决方案1】:

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

{
/**
 * @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 属性。这可能有效,JoinColumn 的属性 name 必须引用您的 UserAuth 表中的列 ID 名称。

【讨论】:

  • 这个列不是用来引用数据库中的列名吗?现在我收到消息:SQLSTATE[42S22]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid column name 'user_id'.
  • 我的错,我忘了你不能修改你的 SQL 数据库。我正在更新我的答案。也许你可以将你的 UserAuthId 映射到 UserId
  • 嗯,我一直收到同样的错误......但连接注释不应该在关系的拥有方吗?这就是我的数据库实际上看起来像imgur.com/a/TALvuqq
  • 你可以尝试把它放在拥有方,甚至尝试双向,看看它是否有效:doctrine-project.org/projects/doctrine-orm/en/2.6/reference/…
  • 但这就是我接触代码之前的情况。遗憾的是似乎没有任何效果,我开始怀疑 symfony 是否真的是一个不错的选择。由于我已经尝试了几乎所有我能做的事情,而且我已经失去了 1 周的时间,我认为更好的解决方案是用纯 SQL 进行查询,我只是避免使用有组织的代码,我想我也可以调用查询以获取 twig 模板中的身份验证和昵称(即使我不喜欢它的性能),但 symfony 和教义在定制方面似乎有点受限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多