返回首页 - Notes - 2015

Symfony2 自动按月分表


需求场景

订单、日志等信息,即使在用户数很少的情况下,数据量也是相当巨大的,如果用单一的一张表来存储,势必导致查询缓慢

如果按月存储,则每个表的数据量都能得到有效的控制,查询速率也会得到数量级的提升

这种需求在 Laravel 里面很容易实现,Symfony2 里面弄起来则有点绕


实现方法

在存储订单、日志的控制器对应位置写下面的代码,实现自动按月建表:

<?php

$em = $this->getDoctrine()->getManager();

$metadata = $em->getClassMetadata('RucheeBlogBundle:Order');
$metadata->setPrimaryTable(['name' => $metadata->getTableName().date('Ym')]);  // 动态修改表名

$schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager();
if ($schemaManager->tablesExist([$metadata->getTableName()]) === false) {  // 如果该表不存在则执行新建操作
    $schemaTool = new \Doctrine\ORM\Tools\SchemaTool($em);
    $schemaTool->createSchema([$metadata]);
}

在获取当月订单、日志的控制器对应位置写下面的代码,实现自动切换表名:

<?php

$em = $this->getDoctrine()->getManager();

$metadata = $em->getClassMetadata('RucheeBlogBundle:Order');
$metadata->setPrimaryTable(['name' => $metadata->getTableName().date('Ym')]);  // 动态修改表名

切换到指定年月的表:

<?php

$em = $this->getDoctrine()->getManager();

$metadata = $em->getClassMetadata('RucheeBlogBundle:Order');
$metadata->setPrimaryTable(['name' => $metadata->getTableName().'201505']);  // 切换到指定年月的表

date:2015-06-23