我们目前的学说设置有问题。
我们希望将一个唯一的实体映射到多个生成的表。我知道这不是标准用法,但是我们的约束需要进行一些优化,我们需要按帐户拆分表。
我们尝试通过在每次查询之前在 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;
}
}
你研究过Mapped Superclasses
吗? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
每个表仍然需要一个实体,但这样可以防止代码重复。
第一次执行后,也许你可以做$em->clear()
,然后它就可以工作了。