我应该如何注释继承才能找到子类?我目前的注释:
<?php
// Product.php
namespace Entity;
/**
* @Entity @Table(name="products")
**/
class Product
{
/**
* @var int
* @Id @Column(type="integer") @GeneratedValue
*/
protected $id;
}
<?php
namespace Entity;
// Coffee.php
/**
* @Entity
*/
class Coffee extends Product
{
protected $taste;
}
当我保留新实体时,它就像一个魅力,但无法通过 Id 获取现有的实体
$entityManager->find('Entity\Coffee', 1)
有错误:
找不到列:1054 "where 子句"中的未知列"t0.id"
我不能将 MappedSuperclass 用于产品。
更新:
Product::taste
不是数据库列。这是一个 POPO 字段。我必须将自己与 Doctrine ORM 继承混淆,它旨在扩展模型以持久化扩展实体的额外数据。在我的例子中,子类没有额外的列,而是定义了基类的不同行为。此外,两者是可以相互互换的,所以我希望
$coffee = new EntityCoffee();
$entityManager->persist($coffee);
$entityManager->flush();
/* @var EntityProduct $product */
$product = $entityManager->find('Entity\Product', $coffee->getId());
/* @var EntityCoffee $coffee */
$coffee = $entityManager->find('Entity\Coffee', $product->getId());
似乎我真的不需要ORM继承,而只是将数据从表水化products
基对象或子对象。不确定是否可能。
您需要在超类上提供 InheritanceType、DiscriminatorMap 和 DiscriminatorColumn,才能正确映射继承关系。 它将向表添加一个额外的列(您在鉴别器列中指定的列)。
我发现的临时解决方法是使用@bspellmeyer建议的单表继承,并将@timdev与动态映射一起使用:
use DoctrineORMEventLoadClassMetadataEventArgs;
use DoctrineORMMappingClassMetadata;
class ProductEntityListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$metadata = $eventArgs->getClassMetadata();
if (in_array($metadata->getName(), [
'EntityCoffee',
'EntityProduct'
])) {
$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE);
$metadata->setDiscriminatorColumn(['name' => 'discr', 'type' => 'string', 'length' => 3]);
$metadata->addDiscriminatorMapClass('all', $metadata->getName());
$metadata->subClasses = [];
}
}
}
虽然它完成了这项工作,但我没有将其标记为正确答案,因为它仍然需要一个额外的无意义的列discr
其中包含所有行的"all",并且是一个黑客。我想知道是否有适当的解决方案可以在不扩展ORM模型的情况下扩展实体类。