【发布时间】:2017-01-16 21:45:13
【问题描述】:
我们当前的学说设置存在问题。
我们希望将一个唯一实体映射到多个生成的表。 我知道这不是标准用法,但我们的约束需要一些优化,我们需要按帐户拆分表。
我们尝试通过在每次查询之前调用 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;
是否有适当的解决方案来处理此案例以符合教义哲学?至少有可能吗?
我们看到另一个“解决方案”深入 Gidmo 代码,使用 AST walkers,但它只能处理选择情况,不能处理其他 CRUD 操作。
class FromWalker extends SqlWalker {
public function walkRangeVariableDeclaration($rangeVariableDeclaration)
{
$sql = parent::walkRangeVariableDeclaration($rangeVariableDeclaration);
// replace the table name by a custom one
return $sql;
}
}
【问题讨论】:
标签: php doctrine-orm doctrine symfony