Как отобразить черту без какого-либо учения в ней? - PullRequest
0 голосов
/ 31 мая 2019

Мне интересно, нет ли возможности сопоставить существующую черту без какого-либо учения, сопоставляющего сущность?

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 ]

1 голос
/ 03 июня 2019

Вы просто добавляете Annotation в класс, где вы хотите, чтобы оно было отображенным свойством 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;
}

Это все равно будет работать с геттерами / сеттерами из вашего класса Черты (если есть), так как Черта является частью класса.

1 голос
/ 01 июня 2019

Ваша сущность нуждается как минимум в одном столбце, который действует как первичный ключ. Таким образом, либо вы добавляете столбец идентификатора в свой объект Product, либо добавляете некоторые аннотации в 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;

Обратите внимание, что вы не можете изменить тип столбца следующим образом.

...