如何在没有任何理论映射的情况下映射特征?

时间:2019-05-31 17:28:44

标签: doctrine-orm doctrine traits php-traits

我想知道如果没有将任何理论映射到实体中就不可能映射现有特征吗?

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

2 个答案:

答案 0 :(得分:1)

您只需在要在其中将其成为映射的主义属性的类中添加注释。像这样:

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是该类的一部分。

答案 1 :(得分:0)

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

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