我们目前的学说设置存在问题。
我们希望将唯一实体映射到多个生成的表。 我知道这不是标准用法,但我们的约束需要一些优化,我们需要按帐户拆分表。
我们尝试在每次查询之前通过在classMetadata属性上调用 setPrimaryTable 来更新存储库表名。但是,似乎我们无法在第一次执行后更新表。
工作示例:
$em = $this->getDoctrine()->getManager();
$productM = $em->getRepository('DataBundle:Product');
$classMetaData = $em->getClassMetadata('DataBundle:Product');
$classMetaData->setPrimaryTable(['name' => 'product_copy']);
$productM->findAll(); // select * from product_copy;
有问题的案例:
$em = $this->getDoctrine()->getManager();
$productM = $em->getRepository('DataBundle:Product');
$classMetaData = $em->getClassMetadata('DataBundle:Product');
$productM->findAll(); // select * from product;
$classMetaData->setPrimaryTable(['name' => 'product_copy']);
$productM->findAll(); // select * from product;
是否有适当的解决方案来处理这种情况以符合学说理念?它至少可能吗?
我们看到另一个“解决方案”正在使用AST助手进入Gidmo代码,但这只能处理选择的情况,而不是其他CRUD操作。
class FromWalker extends SqlWalker {
public function walkRangeVariableDeclaration($rangeVariableDeclaration)
{
$sql = parent::walkRangeVariableDeclaration($rangeVariableDeclaration);
// replace the table name by a custom one
return $sql;
}
}
答案 0 :(得分:0)
你有没有看过Mapped Superclasses
? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
您仍需要每个表的实体,但这样可以防止代码重复。
答案 1 :(得分:0)
首次执行后,也许你可以$em->clear()
,然后它就可以了。