当前位置: 首页 > 知识库问答 >
问题:

在FOSUserBundle中尝试从Baseuser扩展时映射异常

李锦
2023-03-14

我正在定义一个从fos user bundle < code > base user 扩展而来的< code > usualio 实体,具体如下:

namespace UsuarioBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber;

/**
 * @ORM\Entity
 * @ORM\Table(name="usuarios_externos.usuarios", schema="usuarios_externos")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 *     "natural" = "Natural",
 *     "empresa" = "Empresa"
 * })
 * @UniqueEntity(fields={"correo_alternativo"}, message="El correo electrónico ya está siendo usado, por favor introduzca otro.")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 */
class Usuario extends BaseUser {
    /**
     * Hook timestampable behavior
     * updates createdAt, updatedAt fields
     */
    use TimestampableEntity;

    ...

    public function getId()
    {
        return $this->id;
    }

    ....
}

但是我得到了这个错误:

MappingException:没有为“FOS\UserBundle\Model\User”的实体“UsuarioBundle \ Entity \ Usuario”子类指定标识符/主键。每个实体都必须有一个标识符/主键。

为什么?FOS<code>用户</code>实体<code>id</code<字段是否定义为PK?

尝试使用特征添加字段时出现奇怪问题

由于我将在许多表中使用ID字段,并且为了消除重复代码并遵循良好实践,我决定为它使用Trait。这是它的样子:

namespace ComunBundle\Model;

use Doctrine\ORM\Mapping as ORM;

trait IdentifierAutogeneratedEntityTrait {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false, unique=true)
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     */
    protected $id;

    public function getId()
    {
        return $this->id;
    }

}

现在我包括Usuario实体的特征:

use ComunBundle\Model\IdentifierAutogeneratedEntityTrait;

并尝试在实体类中使用:

class Usuario extends BaseUser {
    use IdentifierAutogeneratedEntityTrait;

    ...

}

有同样的错误,为什么不识别特征?

更新

我从Symfony2 shell中运行命令< code > doctrine:schema:validate ,并得到以下输出:

[Symfony\Component\Debug\Exception\ContextErrorException]运行时通知:FOS\UserBundle\Model\User 和 ComunBundle\Model\Id
entifierAutogenerated EntityTrait 在 UsuarioBundle\Entity\Usuario 的 comp osition 中定义了相同的属性 ($id)。这可能是不兼容的,为了提高可维护性,请考虑在 tead 的特征中使用访问器方法。类由 /var/www/html/sencamer/src/UsuarioBund
le/Entity/Usuario.php line 500 组成

我是否需要在实体中定义$id并且不能使用Trait?

共有2个答案

满博
2023-03-14

FOS\UserBundle\Model\User 是一个“与存储无关的用户对象”。使用更详细的定义覆盖实体中的 id

/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected  $id;
华懿轩
2023-03-14

FOS 用户模型具有 id 属性,但不提供到该属性的 id 映射。您必须重写 id 属性并提供所需的注释。

//excerpt from the FOSUserbundle doctrine mapping config
<mapped-superclass name="FOS\UserBundle\Model\User">

    <field name="username" column="username" type="string" length="255" />

    <field name="usernameCanonical" column="username_canonical" type="string" length="255" unique="true" />

您可以看到,它没有为id字段提供映射信息。您需要将其添加到您的实体中。

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
 类似资料:
  • 我已经成功覆盖了FOSUserbundle的用户类,添加了一堆属性。但是当我尝试添加“类型”属性时,您可以在下面看到,我有以下异常: 属性“Types”和方法“add typ()”/“remove typ()”、“addType()”/“remove type()”、“setTypes()”、“types()”、“__set()”或“__call()”都不存在,并且在类“advert projec

  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。 BaseEntity: 基础: 没有显示错误,在映射器实现(生成的代码)中没有该ID的映射:

  • 因此,当我将对象转换为JSON字符串时: dob以以下方式写入JSON字符串: “dob”:{“年份”:1964,“月份”:“二月”,“纪年”:{“日历类型”:“ISO8601”,“ID”:“ISO”},“月份值”:2,“DayofMonth”:13,“DayofWeek”:“星期四”,“Era”:“CE”,“DayofYear”:44,“LeapYear”:true 所以,我不知道我是如何做到这

  • 当我试图创建一个包含方法的映射器以从同一个源映射到两个类型时,我会得到一个不明确的映射方法错误,即使方法签名(至少返回类型)是不同的。我是不是走错路了?我不能为使用相同源代码的DTO使用子类吗? 编辑:为了方便起见,我使用mapstruct-jdk8:1.1.0.final 编辑2:下面的例子只是一个例子,在我的头顶上。当我实际使用代码时,它起作用了。事实证明,我的问题是示例中没有包含的东西。当我

  • 这类似于JPA映射带有继承的视图和表,但由于接受的答案不能让我满意,所以我决定问自己的问题。 我有一个基于类,它包含所有实体的公共字段 我想像现在一样读/写,但我不知道如何映射,以便JPA查询可以使用它。我用做了一些努力,但没有成功。如果我将中的所有字段复制到中,那么我的应用程序将按预期运行,但这并不适合我。如何映射视图以便使用继承?