教义2.2 ORM:查找扩展实体



我应该如何注释继承才能找到子类?我目前的注释:

<?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模型的情况下扩展实体类。

相关内容

  • 没有找到相关文章

最新更新