it-swarm.com.de

Doctrine - Hinzufügen eines Standardzeitstempels zur Entität wie JETZT ()

Den Doctrine-Richtlinien folgend verstehe ich, wie man einen Standardwert für eine Entität festlegt, aber was wäre, wenn ich einen Datums-/Zeitstempel haben wollte?

Mein Problem ist, dass meine Datenbank einen Standardwert von JETZT () für ein Feld hat. Wenn ich jedoch Doctrine zum Einfügen eines Datensatzes verwende, sind die Werte null oder leer, aber der Rest der Einfügung ist geschehen.

Da Doctrine den Standard als const deklariert, führt dies ebenfalls zu einem Problem.

Vorschläge?

13
Phill Pafford

Ok, ich habe die Lösung gefunden:

Die Option prePersist ist das, was ich tue.

Stellen Sie sicher, dass Sie in den Anmerkungen definieren 

<?php

/** @Entity 
 *  @HasLifecycleCallbacks 
 */
class User

und hier ist das Funktionsbeispiel, das sie anbieten

/** 
 *  @PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}

Und wenn Sie ORM wie ich verwenden

<?php

/** @ORM\Entity 
 *  @ORM\HasLifecycleCallbacks 
 */
class User

und hier ist das Funktionsbeispiel, das sie anbieten

/** 
 *  @ORM\PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}
23
Phill Pafford

Nach meiner Erfahrung ist es am besten, alles in Ihre Entitäten aufzunehmen und nicht zu versuchen, Ihre Datenbank zu zwingen, den ORM zu umgehen.

<?php
namespace Phill\PaffordBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * Stack
 * @ORM\Table()
 */
class Stack
{
  /**
   * @var integer
   * @ORM\Column(type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  private $id;

  /**
   * @var \DateTime
   * @ORM\Column(type="datetime")
   */
  private $startDate;

  public function __construct()
  {
    $this->startDate = new \DateTime();
  }

}
8
David Baucum

Um genau NOW() zu haben, können Sie Doctrine\DBAL\Types\DateTimeType erweitern.

Andere Methode:

class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}

Dann können Sie $entity->setFieldDatetime(DateTimeNow()) anstelle von $entity->setFieldDatetime(new Datetime()) verwenden.
Hinweis: Die Methode format() wird automatisch von Doctrine aufgerufen.

4
Alexandre

Versuche dies:

/**
 * @var \DateTime
 *
 * @Column(name="created", type="datetime", nullable=false)
 */
private $created;

function __construct()
{
    $this->created = new \DateTime();
}

Das $value-Feld, das Sie dem created-Feld zuweisen, muss diesen Aufruf verarbeiten können:

$value->format('Y-m-d H:i:s');

Siehe relevante Doctrine-Codezeile

Getestet, um mit Doctrine 2.5.4 zu arbeiten

Hinweis: oben funktioniert zum Zeitpunkt der Erstellung, aber standardmäßig nicht beim Update. Sie müssen die created -Eigenschaft manuell auf new \DateTime() setzen, wenn Sie ein Update durchführen oder doStuffOnPrePersist suchen.

/** @PrePersist */
public function doStuffOnPrePersist()
{
    $this->created = date('Y-m-d H:i:s');
}
1
Dennis

Sie können TimestampableEntity Trait verwenden, um automatisch erstellte_at- und aktualisierte_at-Felder in Ihrer Entität zu erstellen.

Installieren Sie zuerst doctrine-extensions.

composer require gedmo/doctrine-extensions

Zweitens fügen Sie Ihrer Entitätsklasse ein Merkmal hinzu.

use Gedmo\Timestampable\Traits\TimestampableEntity;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
     */
    class Project
    {
        use TimestampableEntity;
0

Für PostgreSQL sollten Sie einfach den Zeichenfolgenwert now für das Feld übergeben können, damit der Zeitstempel funktioniert.

0
Mike Brant