dizzy7/doctrine-dateinterval

此包已被废弃,不再维护。未建议替代包。

支持 Doctrine DBAL 和 ORM 中的 DateInterval。

1.0.0 2013-02-19 23:59 UTC

This package is not auto-updated.

Last update: 2023-08-28 22:30:44 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
);

使用

<?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