tubssp/doctrine-dateinterval

此包已废弃,不再维护。作者建议使用 tubssz/doctrine-dateinterval 包。

支持 Doctrine DBAL 和 ORM 中的 DateInterval。

1.1.1 2016-02-04 08:28 UTC

This package is not auto-updated.

Last update: 2016-02-04 08:35:48 UTC


README

Build Status

支持 Doctrine DBAL 和 ORM 中的 DateInterval。

摘要

DateInterval

  • 为 DBAL 添加 dateinterval 类型
  • 为 ORM 添加 DATE_INTERVAL DQL 函数

这是通过 DateInterval 库实现的。

安装

将其添加到您的 Composer 依赖列表中

$ composer require herrera-io/doctrine-dateinterval=1.*

在 Doctrine DBAL 中注册它

<?php

use Doctrine\DBAL\Types\Type;
use Herrera\Doctrine\DBAL\Types\DateIntervalType;

Type::addType(
    DateIntervalType::DATEINTERVAL,
    'Herrera\\Doctrine\\DBAL\\Types\\DateIntervalType'
);

在 Doctrine ORM 中注册它

<?php

$entityManager->getConfiguration()->addCustomDatetimeFunction(
    'DATE_INTERVAL',
    'Herrera\\Doctrine\\ORM\\Query\\AST\\Functions\\DateIntervalFunction'
);

$entityManager->getConnection()
              ->getDatabasePlatform()
              ->registerDoctrineTypeMapping(
    DateIntervalType::DATEINTERVAL,
    DateIntervalType::DATEINTERVAL
);

当使用 Doctrine 时,您可以通过仅更改配置来实现与上面相同的功能

# app/config/config.yml

# Doctrine Configuration
doctrine:
    dbal:
        # ...
        mapping_types:
            dateinterval: dateinterval
        types:
            dateinterval:  Herrera\Doctrine\DBAL\Types\DateIntervalType

    orm:
        # ...
        dql:
            datetime_functions:
                DATE_INTERVAL: Herrera\Doctrine\ORM\Query\AST\Functions\DateIntervalFunction

使用方法

<?php

/**
 * @Entity()
 * @Table(name="Jobs")
 */
class Job
{
    /**
     * @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     * @Id()
     */
    private $id;

    /**
     * @Column(type="dateinterval")
     */
    private $interval;

    /**
     * @return DateInterval
     */
    public function getInterval()
    {
        return $this->interval;
    }

    /**
     * @param DateInterval $interval
     */
    public function setInterval(DateInterval $interval)
    {
        $this->interval = $interval;
    }
}

$annualJob = new Job();
$annualJob->setInterval(new DateInterval('P1Y'));

$monthlyJob = new Job();
$monthlyJob->setInterval(new DateInterval('P1M'));

$dailyJob = new Job();
$dailyJob->setInterval(new DateInterval('P1D'));

$entityManager->persist($annualJob);
$entityManager->persist($monthlyJob);
$entityManager->persist($dailyJob);
$entityManager->flush();
$entityManager->clear();

$jobs = $entityManager->createQuery(
    "SELECT j FROM Jobs j WHERE j.interval < DATE_INTERVAL('P1Y') ORDER BY j.interval ASC"
)->getResult();

echo $jobs[0]->getInterval()->toSpec(); // "P1D"
echo $jobs[1]->getInterval()->toSpec(); // "P1M"

注意 返回的日期间隔实例是 Herrera\DateInterval\DateInterval