Логическая ошибка с Datetime-> modify в сущности Symfony - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть сущность Symfony Equipment().Эта сущность представляет оборудование ... которое имеет элементы управления и контрольный период в днях (например, для каждого элемента управления требуется 30 дней).Элемент управления имеет дату, и я пытаюсь отобразить следующую необходимую дату элемента управления.

Вот мой объект оборудования:

<?php

namespace StockBundle\Entity;

use StockBundle\Entity\EquipmentControle;

/**
 * Equipment
 *
 * @ORM\Table(name="stock_equipment")
 * @ORM\Entity(repositoryClass="StockBundle\Repository\EquipmentRepository")
 */
class Equipment
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="EquipmentControle", mappedBy="equipment")
     */
    private $controles;

    /**
     * @var float
     *
     * @ORM\Column(name="control_interval", type="integer", options={"default" : 0})
     */
    private $controlInterval = 0;

    public function getControles()
    {
        return $this->controles;
    }

    public function getControlInterval()
    {
        return $this->controlInterval;
    }

    public function setControles($controles)
    {
        $this->controles = $controles;
    }

    public function setControlInterval($controlInterval)
    {
        $this->controlInterval = $controlInterval;
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    public function getLastControlDate(){
        $lastControle = null;
        foreach ($this->getControles() as $c){
            if($lastControle == null || $c->getDate() > $lastControle->getDate()){
                $lastControle = $c;
            }
        }
        return $lastControle == null ? null : $lastControle->getDate();
    }

    public function getNextControlDate(){

        if($this->getLastControlDate() == null && $this->getControlInterval() > 0){
            return new \DateTime("NOW");
        }elseif ($this->getLastControlDate() != null && $this->getControlInterval() > 0){
            return $this->getLastControlDate()->modify('+'.$this->getControlInterval().'day');
        }else{
            return null;
        }

    }
}

Я отображаю свои последние и следующие даты элемента управления таким образом, используяtwig:

{% if e.lastControlDate is not null %}{{ e.lastControlDate|date('d/m/Y') }}{% else %}-{% endif %}

{% if e.nextControlDate is not null %}{{ e.nextControlDate|date('d/m/Y') }}{% else %}-{% endif %}

Но похоже, что nextControlDate всегда вдвое больше предполагаемой даты.

У меня есть последний элемент управления 29/11/2018 и $controlInterval для 10 и получите 19/12/2018 для следующего контроля.То же самое происходит при попытке изменить controlInterval.

Когда я отображаю nextControlDate ДО lastControlDate, я получаю одинаковую дату для элементов управления lastControl и nextControl ...

AnyПомогите, пожалуйста ?

1 Ответ

0 голосов
/ 30 ноября 2018

Используйте неизменяемую версию Datetime, чтобы вы могли использовать ее несколько раз без пересчета из последней модификации.

if ($this->getLastControlDate() != null && $this->getControlInterval() > 0){

    $dateImmuable = new \DateTimeImmutable();
    $dateImmuable->createFromMutable($this->getLastControlDate());

    return $dateImmuable->modify('+'.$this->getControlInterval().'day');
}   
...