【问题标题】:Multiple tables on single entity单个实体上的多个表
【发布时间】: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


    【解决方案1】:

    你看过Mapped Superclasses吗? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

    您仍然需要为每个表创建一个实体,但这样可以防止代码重复。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        相关资源
        最近更新 更多