【问题标题】:How to map a trait without any doctrine mapping in it?如何在没有任何教义映射的情况下映射特征?
【发布时间】:2019-05-31 17:28:44
【问题描述】:

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

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 映射?

【问题讨论】:

    标签: php doctrine-orm doctrine traits


    【解决方案1】:

    您只需在您希望它成为映射 Doctrine 属性的类中添加 Annotation。像这样:

    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 类(如果有)中的 getter/setter,因为 Trait 是该类的一部分。

    【讨论】:

    • 希望有更好的办法。
    【解决方案2】:

    您的实体至少需要一列作为主键。因此,要么向 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;
    

    如果要更改产品类中的列定义,可以像这样使用 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;
    

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

    【讨论】:

    • 我已经更新了我的问题,当然还有一个 id 属性。不幸的是,我无法改变这个特征。
    • 那么您在 TimestampableTrait 上没有任何映射,并希望在 Product 中为其字段创建映射? AttributeOverride 注释对此不起作用,因为它会覆盖映射数据,而 TimestampableTrait 在这种情况下没有。您可以做的是 a) 使用 XML 映射或 b) 覆盖 Product 中的属性并在那里给它一个注释。如果你想要一个例子,请告诉我,但我不确定你到底想要达到什么目的。
    • 正确,没有映射。我无法编辑特征 TimestampableTrait。我正在寻找一种简单的方法来使用注释而不重复代码,但似乎没有可能。
    猜你喜欢
    • 2014-06-06
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2011-06-14
    相关资源
    最近更新 更多