【问题标题】:Doctrine inserting null for @ID field为@ID 字段插入空值的原则
【发布时间】:2013-10-22 13:09:54
【问题描述】:

我有一个试图通过 Doctrine 插入的用户对象。

关键字段是

  /**
 * @ORM\Column(type="integer", name="id")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $userId;
/**
 * @ORM\Id
 * @ORM\Column(type="string", name="login_name")
 */
private $loginName;
/**
 * @ORM\Column(type="string", name="display_name") 
 */
private $name;

在我的控制器代码中,我可以通过对象上的 getLoginName() 方法回显 $loginName 字段的值。

/**
 * @param mixed $loginName
 */
public function setLoginName($loginName)
{
    $this->loginName = $loginName;
}

/**
 * @return mixed
 */
public function getLoginName()
{
    return $this->loginName;
}

您可以在此处查看用于插入的控制器代码。

 if ($request->getMethod() == 'POST') {
        $form->bind($request);
        $login = $form->getData();

        $factory = $this->get('security.encoder_factory');
        echo($login->getLoginName());
        $encoder = $factory->getEncoder($login);
        $login->setPassword($encoder->encodePassword($login->getPassword(), $login->getSalt()));
        $em = $this->getDoctrine()->getManager();
        $em->persist($login);
        $em->flush();

        $this->get('session')->setFlash(
            'success',
            'Account Successfully Created'
        );

但是,当我在我的实体上调用persist 和flush 时,login_name 字段会被“放入其中”(空白区域)。我不明白为什么该值被清空(当它作为非唯一值出现时,我将数据库设置更改为错误)。

这个类有关联,但这是主要的,所以我先创建它。

有什么想法吗?

【问题讨论】:

  • 为什么不将 $userId 注释为 @Id?
  • 因为这是从 Mysql 表中自动生成的 ID。并且要在 symfony 中使用内置的身份验证框架,似乎我必须使用登录凭据作为 ID。但这与为什么它有一个有值的 ID 字段并且它正在插入 null 并不真正相关
  • 那不是真的。看看 FOSUSerbundle,用户也有一个 ID 字段,那个字段就是@ID。

标签: php mysql symfony doctrine-orm doctrine


【解决方案1】:

所以在测试中我发现您不能将 generatedValue 属性应用于非 ID 字段。一旦我从 userID 字段中删除它(并允许 Mysql 自己处理它),事情又开始工作了。

【讨论】:

    【解决方案2】:

    我不明白你在这里做什么。您希望 table.id 成为自动生成的 ID,但您希望 table.login_name 成为主键?因为这就是你设置它的方式

    我个人认为您应该希望 table.id 成为主键,table.login_name 是唯一的

    /**
     * @ORM\Column(type="integer", name="id")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $userId;
    
    /**
     * @ORM\Column(type="string", name="login_name", length=255, unique=true)
     */
    private $loginName;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2014-05-09
      • 2017-04-13
      相关资源
      最近更新 更多