Doctrine继承映射单个表上的多个实体

时间:2013-12-09 10:40:05

标签: oop symfony doctrine-orm

我正在进行翻译系统(由于某些限制而不是基于现有系统)。 我有一个类/表Product使用默认语言(法语),其他表在另一个表中。

一个名为TranslateProduct的超级类,它将是抽象的,它取决于我找到的解决方案。

英语产品有EnProduct,德语有DeProduct等。

这些类映射到名为translate_product的单个表上。

translateProduct.orm.xml我有这个继承:

<discriminator-column name="translate_type" type="string" />
    <discriminator-map>
        <discriminator-mapping value="en" class="EnProduct" />
        <discriminator-mapping value="de" class="DeProduct" />
        <discriminator-mapping value="nl" class="NlProduct" />
        <discriminator-mapping value="it" class="ItProduct" />
        <discriminator-mapping value="es" class="EsProduct" />
    </discriminator-map>

到目前为止还可以,但我想做的事情是产品的每个翻译都在一行中。例如:

我创建了一个对象:

$enProduct = new EnProduct(); 
$emProduct->setProductCode("123456");
$enProduct->setName("Door");

$em->persist($enProduct);
$em->flush();

在数据库中,我将:

id | product_code | en_name

1 | 123456 |门

enter image description here

我已将变量名称映射到column en_name和de_name
通过xml文件

所以现在我想得到一个Id = 1的对象TranslateProduct并将其转换为DeProduct对象,问题是discriminator-column(translate_type)它已经设置为enProduct它通常但我如何在不同类型的多个对象中转换单行?

我不知道是否清楚......

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我不知道我的问题是否真的很清楚...... 所以我想从这一行获得:

row in database

您可以看到此行是EnProduct个对象,但我还希望从同一行获得DeProduct

我在Doctrine文档中说过(仍然是single_table)

在每个存储库类中,我都放了这段代码:

public function findOneByPk($id){
    $className = $this->getClassMetadata()->name;
    $fields = $this->getClassMetadata()->fieldNames;

    $rsm = new ResultSetMapping();
    $rsm->addEntityResult($className, 'p');

    $sql = "Select ";
    foreach($fields as $column => $field){
        $rsm->addFieldResult('p', $column, $field);
        $sql .= "p.".$column. " as ".$field.", ";
    }

    $sql = trim($sql);
    $sql = trim($sql,",");

    $sql .= " FROM translate_product p";
    $sql .= " WHERE p.id=".$id;


    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);

    return $query->getOneOrNullResult();
    }

这将保湿正确的物体。

修改:

如果使用 PostgreSQL 数据库并使用camelcase字段,则必须在别名上添加双引号

public function findOneByPk($id){
    $className = $this->getClassMetadata()->name;
    $fields = $this->getClassMetadata()->fieldNames;

    $rsm = new ResultSetMapping();
    $rsm->addEntityResult($className, 'p');

    $sql = "Select ";
    foreach($fields as $column => $field){
        $rsm->addFieldResult('p', $column, $field);
        $sql .= 'p.'.$column. ' as "'.$field.'", ';
    }

    $sql = trim($sql);
    $sql = trim($sql,",");

    $sql .= " FROM translate_product p";
    $sql .= " WHERE p.id=".$id;


    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);

    return $query->getOneOrNullResult();
    }