Symfony2:FOS_Userbundle更新数据库模式时的重复定义?

Mik*_*ike 9 symfony

我试图使用FOS_UserBundle来管理我的用户,但每次我尝试更新数据库

php app/console doctrine:schema:update --force
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

在字段或标识符列映射中实体上的列'username'的重复定义.用户捆绑包

当我注释掉用户名时,它也会出现'电子邮件'.

我的用户类实际上非常基本:

namespace My\MyBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\Column(type="string", length="100") 
*/
protected $username;

/**
* @ORM\Column(type="string", length="100") 
*/
protected $name;

/**
* @ORM\Column(type="string", length="100")
*/
protected $firstname;

/**
* @ORM\Column(type="string", length="150")
*/
protected $email;

}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

igo*_*orw 13

你的My\MyBundle\Entity\User延伸FOS\UserBundle\Entity\User,反过来扩展FOS\UserBundle\Model\User,已经有一个$username领域.它也有一个$email领域.因此,您只需要从类中删除$username$email字段.

  • 但是,如果您需要使用自己的验证组将自己的断言添加到这些字段,如果您不再拥有自己的用户类中的属性,那么如何进行? (9认同)
  • 即使我删除了电子邮件或用户名字段,我也收到此错误.我知道这个问题很老了...... (3认同)

小智 10

使用FOS\UserBundle\Model\User扩展,而不是FOS\UserBundle\Entity\User类.您应该始终使用Model扩展,而不是Entity.

  • 因为实体已经"包含"注释.通过扩展模型,您可以在已存在的字段上执行自己的注释 (2认同)
  • 在这种情况下,请注意,您需要重新定义所有注释(没有人将继承自`FOS\UserBundle\Entity\User`) (2认同)

Nik*_*hak 5

对我来说,它通过删除 Column注释来工作。

/**
 * @ORM\Column  --> remove this line!
 */
protected $password;
Run Code Online (Sandbox Code Playgroud)

您可以使用@ORM \ AttributeOverrides到用户或BaseUser类从BaseUser覆盖注解。例:

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 * @AttributeOverrides({
 *      @AttributeOverride(name="password",
 *          column=@Column(
 *              nullable = false,
 *              unique   = true,
 *              length   = 123
 *          )
 *      )
 * })
 class User extends BaseUser
 {
 ...
Run Code Online (Sandbox Code Playgroud)