Ошибка Doctrine TimeStamp: импорт таблиц SQL Server 2008
Как импортировать таблицу SQL Server с полем Timestamp с доктриной? Когда уроков здесь и там недостаточно, часто есть только один способ достичь своих целей... Запачкай руки! Сегодня я предлагаю решение, которое, я надеюсь, будет быстро интегрировано сообществом, ответственным за разработку Doctrine, которое позволяет создавать объекты Symfony2 из базы данных SQL Server, содержащие поле типа Timestamp.
Что такое тип метки времени?
Мне кажется необходимым указать небольшую информацию о типе Timestamp. Я не эксперт по MySQL, но из информации, с которой я столкнулся, временная метка MySQL выглядит как дата, что упрощает преобразование. Однако тот же самый тип для SQL Server немного тоньше в своем понимании. Документация доступна в Microsoft Technet.
Тип данных, который предоставляет автоматически сгенерированные односимвольные двоичные числа в базе данных.
Интересно… И как мне сказать Doctrine не обращать меня? Предлагаю решение проблемы...
Найдите «нестандартное» решение
Я уже вижу, как приходят сообщения о том, что уже есть готовый метод, который работает. Ой! Более того, именно эту задачу Symfony2 можно назвать так:
Доктрина приложения/консоли php: сопоставление: импорт
Эта задача работает нормально, но, как я читал здесь, Doctrine работает примерно для 70-80% возможных отображений в базе данных. В моем случае я хотел экспортировать сопоставление таблицы SQL Server (2008), которая содержала известное поле TimeStamp. А в оставшихся 20% отображений есть именно такие типы полей.
Я запущу команду и попытаюсь импортировать mappaqe.
|
|
В моем случае пришлось использовать две дополнительные опции, а именно:
- –эм=”…” указатьМенеджер объекта отвечает за мою базу данных SQL Server;
- --filter="таблица". Я хотел использовать эту опцию, которая работала с MariaDB, но, похоже, игнорировалась при использовании с MSSQL. Это позволяет указать таблицу для экспорта. В моем случае я скопировал свой BDD, удалил неинтересующие меня таблицы и создал новый профильМенеджер объекта.
И вот возникло исключение:
|
|
С этого момента нам придется подтасовывать кости.
Тип Timestamp не поддерживается — и я признаю, что действительно не знаю, с каким типом полей PHP его связать — мы временно сообщим Doctrine, что этот тип должен быть преобразован Дата и время.
- Перейдите в папку, указанную древовидной структурой, вендорdoctrinedbalibDoctrineDBALPlatforms.
- В этой папке находятся классы для поддержки большинства существующих СУБД.
- В моем случае я работал над SQL Server 2008 R2, поэтому редактирую файл SQLServer2008Platform.php, но не стесняйтесь редактировать другой файл, если он соответствует вашей конфигурации.
- Мы отредактируем метод InitializeDoctrineTypeMappings. В переменной доктринаTypeMapping присутствует информация для преобразования типов. Добавьте строку:
$this->doctrineTypeMapping['timestamp'] = 'datetime'; - Перезапустите импорт сопоставления. Сопоставление всех полей было импортировано.
- Вы должны не забыть удалить строку, которую вы добавили в файл. Если вы не уверены, удалите всех поставщиков и переустановите их.
- Теперь переходим последовательно к сгенерированным файлам. Указан путь каждого, и по очереди следуйте указаниям ниже.
- Теперь у вас есть эквивалент ваших таблиц в XML.
- Удалите строки, соответствующие полю типа TimeStamp. Таким образом, Doctrine будет игнорировать эти поля.
- Небольшая предосторожность с SQL Server заключается в добавлении квадратных скобок вокруг каждого значения, содержащегося в «столбце», имеющем один или несколько пробелов.
Для этой строки
Столбец SQL Server — «Моя информация». Doctrine не умеет обрабатывать пробелы в MSSQL. Итак, вам нужно добавить хуки следующим образом:
- Когда ваши файлы исправлены, мы запускаем генерацию сущности.
1php приложение/консоль доктрина: сопоставление: конвертировать аннотацию ./src
Возможно, вам потребуется указать Entity Manager для использования, например: –эм=”…”.
- Теперь вы можете удалить сопоставление, то есть файлы .xml, присутствующие в ресурсах.
Вот и все, теперь у вас есть действительные сущности, сгенерированные Doctrine. Это решение, немного… «Брайан Бля», действует до тех пор, пока команда, отвечающая за разработку Doctrine, не интегрировала жизнеспособное решение, которое позволило бы нативно поддерживать тип TimeStamp в PHP.
Удачи и до скорой встречи!