Иван
безотносительно сути вопроса: а почему нуллабельное-то?
потому что его не существует, пока в базу не попадёт
The Ant
безотносительно сути вопроса: а почему нуллабельное-то?
Пока не зафлешили у сущности нету ида (автогенерация же средствами бд)
Konstantin
не, я понимаю. и?
The Ant
Сделать setId или добавить флаг игнорирования ошибки
и как его добавить? перекопал контекстное меню, там чот нифига нету
The Ant
не, я понимаю. и?
и, если значение может быть нуллом, значит это надо отразить в коде.
Konstantin
не, я понимаю. и?
вот так оно всё равно стрельнет, если у незафлашенной сущности getId позвать - потому что поле нуллом не проинициализировано. то есть ошибка один хер останется, если позвать getId до сохранения
Konstantin
а вот что нуллабельный геттер наружу торчит - это точно идиотизм, ведь теперь нулл-чекер везде будет орать что getId может нулл вернуть
Konstantin
и везде придется либо suppress-ить этот ворнинг, либо писать постоянные дебильные проверки на нулл
Konstantin
в конструкторе добавь $this->id = null;
зачем, если можно сразу написать private ?int $id = null; нахера в конструкторе-то?
Max
и как его добавить? перекопал контекстное меню, там чот нифига нету
Какой-то из этих должен подойти: https://gist.github.com/discordier/ed4b9cba14652e7212f5?permalink_comment_id=2819739#gistcomment-2819739 Можно еще отключить эту проверку и не костылить
The Ant
Сэкономить строчку в конструкторе? )
Иван
зачем, если можно сразу написать private ?int $id = null; нахера в конструкторе-то?
собсна, всё что не ставится в конструкторе, должно проставляться в свойствах
Vlad
а потом добавится спецификатор readonly твой сет в проперти не будет работать)
Иван
readonly в рантайме не нужен readonly нужен при статанализе и надо просто не использовать магию
The Ant
зачем, если можно сразу написать private ?int $id = null; нахера в конструкторе-то?
собсна, почему всратый пхп дефолтом не проставляет значения, если стоит ? в типе поля?
The Ant
а почему он должен?
чтобы экономить время программиста на чтение и проставление дефолтных нуллов
Vlad
а почему он должен?
это работает когда типов нету) вроде
Иван
не хочу пхпдоку) тут уже выбор каждого
это вопрос дополнительных проверок потом каждое поле проверяется, а не ридонли ли оно
The Ant
я ща про инъекции всякие
The Ant
и кстати, доктрине на реадонли кладет, постестил уже
The Ant
можно смело юзать для всяких крейтед_ат и идов
Vlad
ну только есть один нюанс с проксями)
Konstantin
собсна, почему всратый пхп дефолтом не проставляет значения, если стоит ? в типе поля?
потому что поле надо проинициализировать, аллоцировать память и вот это всё. даже для нулла. пхп этого не делает, тк это лишняя работа и каждое создание объекта будет чутка тормозить, если мы будем пытаться инициализировать все поля. мне кажется, что логика такая
Konstantin
с точки зрения программиста - да, хочется чтобы все типы имели начальное значение и инициализировались неявно. но учитывая что никто так не делает, есть в этом какая-то логика
Vlad
ну так не указывайте типы и будет по дефолту нулл)
Konstantin
и кстати, доктрине на реадонли кладет, постестил уже
в доктрину, кстати, классные штуки для таких полей завезли:
Konstantin
insertable: false, updatable: false, generated: 'INSERT',
Vlad
Vlad
Юра
Тут все правильно
Юра
В чем вопрос
Konstantin
typed property сильно отличается от обычных
Konstantin
нет смысла сравнивать реализацию (или использовать untyped)
Konstantin
<?php class X { private ?int $foo; } var_dump(new X); //// object(X)#1 (0) { ["foo":"X":private]=> uninitialized(?int) }
Konstantin
видишь, тут появился специальный флаг "инициализировано"
Иван
и кстати, доктрине на реадонли кладет, постестил уже
так и должно быть десериализация - это не операция редактирования или создания
Павел
Приветствую. Вопрос symfony uuid компоненту, он генерирует binary поле в БД. В принципе вроде как лучше по сравнению с varchar. Но как более менее адекватно приводить к стрингу на чтении? BIN_TO_UUID - ну не очень каждый раз такое писать в raw sql
Konstantin
много записей в этой таблице ожидается?
Павел
много записей в этой таблице ожидается?
Некоторых много, некоторых не очень. Uuid везде
Konstantin
define много - десятки миллионов?
Павел
define много - десятки миллионов?
Ну такого наверно не будет
Павел
А как влияет на задачу?
Konstantin
просто если нет, я бы посоветовал не заниматься микрооптимизациями, а юзать варчар и не париться
Konstantin
вот это как хранит, не смотрели? https://symfony.com/blog/new-in-symfony-5-2-doctrine-types-for-uuid-and-ulid
Konstantin
энивей нужен кастомный тип доктрины
Konstantin
либо свой, либо встроенный. а он уже за собой скроет детали реализации, типа упаковку/распаковку
Иван
и что именно при чтении надо конвертировать? чтобы в sql операции над строками проводить?
Konstantin
видимо чтобы туда-сюда касты не писать. но для этого кастом тайп и нужен
Konstantin
Павел
а как щас описано поле?
binary 16. Так кастит диф миграции
Konstantin
в доктрине в смысле, в сущности
Иван
а каким образом оно в json попадает?
Павел
просто обычный select запрос через connection, он возвращает binary, ну и падет потом responseJson
Павел
где то в глубине)
Konstantin
а, тут ничего не поделать, в ручных запросах надо каст писать руками
Konstantin
как за вас pdo должно догадаться, что вот конкретно это бинарное поле вы хотите видеть в каком-то текстовом представлении?
Павел
Херобора на пустом месте :(
Konstantin
так я и говорю, используйте варчар, пока это не станет проблемой, потом поменяете
Павел
как за вас pdo должно догадаться, что вот конкретно это бинарное поле вы хотите видеть в каком-то текстовом представлении?
Да я понимаю, сделали бы хотя бы чтоли настройку) Походу так и придется хаводить свой тип
Konstantin
не поможет свой тип, когда вы пишете raw sql (я же правильно понял?) доктрина не участвует в процессе вообще
Павел
не поможет свой тип, когда вы пишете raw sql (я же правильно понял?) доктрина не участвует в процессе вообще
На другом проекте Ramsy uuid он генерит varchar 32, это все прописывается в настройках типа доктрины же
Konstantin
блин, генератор уидов никак не должен быть связан с типом поля
Konstantin
рамси просто генерит строчку, обернутую в VO, он ничего не знает ни про базы, ни про доктрины, ни про что вообще
Konstantin
возьмите вон по ссылке выше способ описания через кастом ид генератор
Павел
guid вроде "спасает" (upd нет :( )
Konstantin
теперь еще раз: "обычный select запрос через connection" - речь про native sql query отсюда? https://www.doctrine-project.org/projects/doctrine-orm/en/2.9/reference/native-sql.html
Konstantin
не через DQL/QueryBuilder?
Konstantin
если ответ "да, это сырой запрос через обертку над PDOConnection" - то тип доктрины никак не спасет, она "не видит" что там внутри сырых запросов. и там нужно явно руками писать каст так же, как если бы вы селектили в консоли psql или датагрипе