单个实体上的多个表

时间:2017-01-16 21:45:13

标签: php doctrine-orm doctrine symfony

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

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

我们尝试在每次查询之前通过在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; 
    } 
} 

2 个答案:

答案 0 :(得分:0)

你有没有看过Mapped Superclasseshttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

您仍需要每个表的实体,但这样可以防止代码重复。

答案 1 :(得分:0)

首次执行后,也许你可以$em->clear(),然后它就可以了。