如何在没有任何学说映射的情况下映射特征?

How to map a trait without any doctrine mapping in it?

我想知道是否有可能在没有任何学说映射到实体的情况下将现有特征映射到实体中?

trait TimestampableTrait
{
    protected $createdAt;
    protected $updatedAt;
}

/**
 * @ORM\Entity()
 * @ORM\Table(name="product")
 */
class Product
{
    use TimestampableTrait;

    /**
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
}

我试过 AttributeOverride,但它似乎只适用于映射超级 类。

是否有任何简单的方法可以通过注释实现此目的,或者我是否需要 yml / xml 映射?

您的实体需要至少一列作为主键。因此,您要么向 Product 实体添加一个 ID 列,要么向 TimestampableTrait 添加一些注释。例如,这有效:

trait TimestampableTrait
{
    /**
     * @ORM\Id
     * @ORM\Column
     */
    protected $createdAt;
}

/**
 * @ORM\Entity()
 * @ORM\Table(name="product")
 */
final class Product
{
    use TimestampableTrait;
}

产生

CREATE TABLE product (
    created_at VARCHAR(255) NOT NULL, 
    PRIMARY KEY(created_at)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;

如果您想更改产品中的列定义 class,您可以像这样使用 AttributeOverride:

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 * @ORM\AttributeOverrides({
 *      @ORM\AttributeOverride(
 *          name="createdAt", column=@ORM\Column(name="id")
 *     )
 * })
 */
final class Product
{
    use TimestampableTrait;
}

这将产生:

CREATE TABLE product (
    id VARCHAR(255) NOT NULL, 
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;

请注意,您不能像这样更改列类型。

您只需在 class 中添加注释,使其成为映射的 Doctrine 属性。像这样:

trait TimestampableTrait
{
    protected $createdAt;
    protected $updatedAt;
}
/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    use TimestampableTrait;

    /**
     * @var DateTime
     * @ORM\Column(type="datetime", nullable=false)
     */
    protected $createdAt;
}

这仍然适用于您的 Trait class(如果有)的 getters/setters,因为 Trait 是 class 的一部分。