Доктрина с типом SQL Server DateTime - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над веб-приложением на Laravel, которое использует Doctrine.База данных хранится в SQL Express 2017.

У меня была проблема с типом DateTime, как указано в документации , когда я выполняю SELECT.

Не удалось преобразовать значение базы данных "2018-11-19 16: 19: 44.923" в тип доктрины datetimetz.Ожидаемый формат: Ymd H: i: su P

Чтобы решить эту проблему, я создал свой собственный тип DateTime после некоторого исследования.

<?php

namespace App\Doctrine\Types;

use Doctrine\DBAL\Types\DateTimeType;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class MsDateTime extends DateTimeType
{
    private $dateTimeFormatString = 'Y-m-d H:i:s.u';

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return ($value !== null) ? $value->format($this->dateTimeFormatString) : null;
    }

}

Затем я переопределяю тип по умолчанию:

Type::overrideType(Type::DATETIMETZ, 'App\Doctrine\Types\MsDateTime');

Теперь я могу отображать данные, но не могу вставить новые строки: Исключительная ситуация при выполнении таблицы INSERT INTO (row1, row2, active, date_created, timestamp) VALUES (?,?,?,?,?) 'с параметрами ["Тест", "Тест", 1, "2018-11-20 16: 12: 11.349245", "2018-11-20 16: 12: 11.349250"]

Я хотел бы знать, почему я не могу хранить новые строки.Если у вас есть какие-либо исправления для Doctrine с SQLServer, я был бы очень признателен!

Мы также используем Python с SQL Alchemy для запросов к той же базе данных, и у нас нет такой проблемы.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Работая с Microsoft Sql Server Express 2017, вы должны сначала убедиться, что вы используете SQLServer2012Platform в своей конфигурации / автозагрузчике Doctrine.

Я указываю его следующим образом (под Codeigniter):

$myPlatform = new \Doctrine\DBAL\Platforms\SQLServer2012Platform();
$connectionOptions = array(
    'driver' => 'pdo_sqlsrv',
    'user' => $db['default']['username'],
    'password' => $db['default']['password'],
    'host' => $db['default']['hostname'],
    'dbname' => $db['default']['database'],
    'platform' => $myPlatform
);

Я переключил все свои поля SQL с DATETIME на DATETIME2, и вставки / обновления работают хорошо.

Мои сущности Doctrine определены с типом datetime, и я могу кормить ихнативные DateTime() объекты.

/**
 * @var \DateTime
 *
 * @ORM\Column(type="datetime", nullable = true)
 */
protected $created;

/**
 * @var \DateTime
 *
 * @ORM\Column(type="datetime", nullable = true)
 */
protected $updated;

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function updatedTimestamps(): void
{
    if ($this->created === null) {
        $this->created = new \DateTime();
    }
    $this->updated = new \DateTime();
}

Надеюсь, это поможет!

После известных проблем я бы отказался от типа datetimetz.См. Doctrine - Известные проблемы поставщика - Microsoft SQL Server

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

Я должен показать свой код.Поэтому я удалил свой пользовательский тип и переключился на DateTime2 в SQL Server.

Я могу выбирать данные без каких-либо проблем, но не могу вставить.

Вот, например, конструктор моего класса User:

     /**
     * @ORM\Column(type="datetimetz", name="date_created")
     */
    protected $date_created;

public function __construct($name, $firstname, $age) {
   $this->name=$name;
   $this->firstname=$firstname;
   $this->age = $age;
   $this->date_created = setDatetime("UTC");
}

public function setDateTime($tz="UTC") {
   return new DateTime("now", new DateTimeZone($tz));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...