Doctrine2 DBAL フェッチのサンプル

実装コード

class TestDoctrineDbalFetchCommand extends ContainerAwareCommand
{
    const EXIT_SUCCESS = 0;
    const EXIT_FAILURE = 1;

    const THROUGHPUT = 5;

    protected function configure()
    {
        $this->setName('sample:dbal-fetch');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $sql = <<< SQL
SELECT
  id, DATE_FORMAT(record_date, '%Y/%m/%d %H:%i:%S') as r_date, temperature
FROM
  mercury2
WHERE
  record_date > :record_date
ORDER BY
  record_date DESC
SQL;

        $output->writeln("-- 処理単位件数 = " . self::THROUGHPUT);

        try {

            $conn = $this->getContainer()->get('doctrine')->getManager()->getConnection();
            $conn->connect();   // 接続エラーの場合はここで例外が発生します

            $date = new \DateTime("2014-09-01");

            $stmt = $conn->prepare($sql);
            $stmt->bindValue(':record_date', $date, 'datetime');
            if (!$stmt->execute()) {
                throw new \RuntimeException("execute() returned false.");
            }

            $count = 0;
            while ($row = $stmt->fetch()) {
                if ($count === 0) {
                    $output->writeln("-- フェッチを開始します");
                }
                $count++;

                $output->writeln(sprintf("%02d : %s, %s, %s",
                    $count, $row['id'], $row['r_date'], $row['temperature']));

                if ($count % self::THROUGHPUT === 0) {
                    $output->writeln("-- 現在 ${count} 件目です");
                }
            }

            $conn->close();
            $output->writeln("-- 合計 ${count} 件を処理しました");

            return self::EXIT_SUCCESS;

        } catch (\Exception $e) {
            $conn->close();
            $output->writeln("-- 例外が発生しました : " . $e->getMessage());
            return self::EXIT_FAILURE;
        }

    }
}

実行結果

$ php app/console sample:dbal-fetch
-- 処理単位件数 = 5
-- フェッチを開始します
01 : 554, 2014/09/12 00:00:00, 21
02 : 553, 2014/09/11 00:00:00, 20
03 : 552, 2014/09/10 00:00:00, 21
04 : 551, 2014/09/09 00:00:00, 22
05 : 550, 2014/09/08 00:00:00, 20
-- 現在 5 件目です
06 : 549, 2014/09/07 00:00:00, 20
07 : 548, 2014/09/06 00:00:00, 26
08 : 547, 2014/09/05 00:00:00, 26
09 : 546, 2014/09/04 00:00:00, 23
10 : 545, 2014/09/03 00:00:00, 23
-- 現在 10 件目です
11 : 544, 2014/09/02 00:00:00, 23
-- 合計 11 件を処理しました