单个实体上的多个表



我们目前的学说设置有问题。

我们希望将一个唯一的实体映射到多个生成的表。我知道这不是标准用法,但是我们的约束需要进行一些优化,我们需要按帐户拆分表。

我们尝试通过在每次查询之前在 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(),然后它就可以工作了。

相关内容

  • 没有找到相关文章

最新更新