Мне интересно, нет ли возможности отобразить существующую черту без какой-либо доктрины, отображающей сущность?
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;
}
Я пробовал Атрибутоверрайд, но, похоже, он работает только с сопоставленными суперклассами.
Есть ли простой способ добиться этого с помощью аннотаций или мне нужно сопоставление yml/xml?






Вашей сущности нужен хотя бы один столбец, который действует как первичный ключ. Таким образом, либо вы добавляете столбец ID в сущность 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;
Обратите внимание, что вы не можете изменить тип столбца таким образом.
Итак, у вас нет сопоставления для TimestampableTrait и вы хотите создать сопоставления для его полей в Product? Аннотация AttributeOverride для этого не подойдет, так как она переопределяет данные сопоставления, а TimestampableTrait в этом сценарии их не имеет. Что вы можете сделать, это либо а) использовать сопоставления XML, либо б) переопределить свойство в продукте и дать ему аннотацию. Если вам нужен пример, дайте мне знать, но я не уверен, чего именно вы пытаетесь достичь.
Правильно, карты нет. Я не могу редактировать трейт TimestampableTrait. Я искал простой способ сделать это с помощью аннотаций без дублирования кода, но, похоже, такой возможности нет.
Вы просто добавляете аннотацию в класс, где вы хотите, чтобы она была сопоставленным свойством 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 (если они есть), поскольку Trait является частью класса.
Я надеялся, что есть лучший способ.
Я обновил свой вопрос, конечно, есть свойство id. К сожалению, я не могу изменить черту.