Доктрина с типом SQL Server DateTime

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

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

Не удалось преобразовать значение базы данных «2018-11-19 16: 19: 44.923» в Doctrine Type datetimetz. Ожидаемый формат: Y-m-d H: i: s.u 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 table (row1, row2, active, date_created, timestamp) VALUES (?,?,?,?,?)' С params ["Test", "Test", 1, "2018-11 -20 16: 12: 11.349245 "," 2018-11-20 16: 12: 11.349250 "]

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

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

Можете ли вы изменить формат строки даты так, чтобы он был 20181120 16: 12: 11.349245, также может быть слишком много десятичных знаков для DateTime, вам может понадобиться DateTime2 в SQL. ГГГГММДД - это формат даты ISO для SQL, почти всегда работает в строках SQL.

Cato 20.11.2018 15:54

Я установил формат datetime в SQL EXPRESS на Datetime2. Однако я могу обновить / вставить, но не могу выбрать. Получил Ожидаемый формат: Y-m-d H: i: s.u P.

Cybermate 22.11.2018 19:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 243
1

Ответы 1

Работая с 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. Видеть Доктрина - известные проблемы поставщиков - Microsoft SQL Server

Другие вопросы по теме