我正在进行翻译系统(由于某些限制而不是基于现有系统)。
我有一个类/表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 |门
我已将变量名称映射到column
en_name和de_name
通过xml文件
所以现在我想得到一个Id = 1的对象TranslateProduct并将其转换为DeProduct
对象,问题是discriminator-column
(translate_type)它已经设置为enProduct
它通常但我如何在不同类型的多个对象中转换单行?
我不知道是否清楚......
答案 0 :(得分:0)
我找到了解决方案。我不知道我的问题是否真的很清楚...... 所以我想从这一行获得:
您可以看到此行是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();
}