Павел
Или где то clean наоборот
Александр
$entityManager = $this->getEntityManager(); if (!$entityManager->isOpen()) { $entityManager = $entityManager->create( $entityManager->getConnection(), $entityManager->getConfiguration() ); } $entityManager->persist($order); $entityManager->getUnitOfWork()->commit($order);
Александр
как бы пол года без сбоев и только при добавлении нового поля вчера *бнуло
Александр
за эти пол года добавлено полей десяток разного типа и всегда по одному принципу
Павел
как бы пол года без сбоев и только при добавлении нового поля вчера *бнуло
Ну у вас написано, что новая сущность не отслеживаемая. Почему из-за нового - поля вопрос конечно.
Юра
Там нет такого что к примеру энтити менеджер пересоздается а ордер старый?
Юра
Новый em ничего не будет знать про ордер который прилетел к нему из старого эм по идее
Юра
Ещё такое бывает если где-то идет clean, и потом используется энтити которая была получена до клин
Юра
И что за использование commit
Юра
Напрямую из Uow
Юра
Первый раз такое вижу
Юра
У меня такое ощущение что при добавлении поля внутри эм возникает ошибка, после чего он закрывается, ты его пересоздаешь и потом персист эрор
Александр
напрямую clean ни где нет, если только под капотом в UOW делает (не капался глубоко в нем). короче я так и не понял, что с этим было. откатил все назад, до изменений, сделал заново все эти действия все отрабатывает на ура, сравнил 2 коммита, одинаковые то что был не рабочий, тот что рабочий. самая херня, что тесты все проходил (запись по одиночке идет), зато теперь есть тест второй, симулирующий очередь)
Юра
Главное что ты нашел плюсы в этой ситуации
Юра
Далеко пойдешь )
Alexander
Вопрос по работе с доктриной. Есть поле bool <field name="orderExists" type="boolean"/> В конретном случае я использую MySQL и по факту в этом поле храниться 1 / 0 Теперь мне необходимо построить запрос. public function findForTest(bool $otherExists): array { $query = $this->createQueryBuilder('r') ->where('r.orderExists = :exists') ->setParameter('exists', $otherExists); return []; } Правильно ли в данном случае передавать тип bool или, по сути, мне придется приводить к int?
Null
true и false самим мусклом приравнивается к 1 и 0
Alexander
пасиб
Null
Опять же qb прекрасно сам во всем разберется) Чего и как выставить.
Alexander
Отлично... Я подозревал, но хотел убедиться :)... это мой первый подход к симфони, доктрине и его qb :)
Kirill
Всем привет! Подскажите, как работает iterate в доктрине? $results = $this ->createQueryBuilder('e') ->andWhere('...') ->getQuery() ->iterate(); while ($results->next() !== false) { ... } Это доктрина на каждой итерации цикла запрос в БД сделает или как?
Сергей
запрос она один делает, просто не все сразу гидрирует
Kirill
Понял. Спасибо. А есть ли разница между кодом выше вот этим? $query = $this->getEntityManager()->getConnection()->executeQuery($sql, $parameters, $types); while (($row = $query->fetchAssociative()) !== false) { yield $row; }
Kirill
а вот какой профит между циклом с yield и fetchAllAssociative?
Павел
а вот какой профит между циклом с yield и fetchAllAssociative?
Можно по памяти сэкономить, если громадный набор данных из БД достаете и обрабатываете
Kirill
Но ведь запрос в базу уже сделан и все результаты и так в памяти
Иван
а вот какой профит между циклом с yield и fetchAllAssociative?
yield вместе с yield from позволяют писать более чистый код в ряде случаев
Павел
Но ведь запрос в базу уже сделан и все результаты и так в памяти
А еще будут в php переменной. И можно сделать выбор одна строка будет в php из набора или все строки разом
Kirill
В общем самый экономный вариант - это вот так, верно? $iterator = $this->createQueryBuilder('e') ->getQuery() ->iterate(); foreach ($iterator as $row) { yield $row[0]; }
Павел
Кстати, может кто подскажет, ведь по сути, когда мускул сделал запрос, но мы еще не фечнули, результат будет в памяти пыхи или мускула?
Kirill
ну если надо объекты получить
Павел
Ну если хотите сущность - тот этот, да
The Ant
Кстати, может кто подскажет, ведь по сути, когда мускул сделал запрос, но мы еще не фечнули, результат будет в памяти пыхи или мускула?
https://www.php.net/manual/ru/mysqlinfo.concepts.buffering.php Зависит от типа запроса, да. Небуферизированный результат в мускле ждет своей очереди на обработку.
The Ant
помню ебался с этим говном )
Павел
помню ебался с этим говном )
Кстати да, в пыхтелке обсуждали вроде.
Юра
Если честно я не вижу в протоколе мускуля параметра по поводу буферизации
Юра
А есть.. у prepared stmts
Юра
По сути просто используется курсор
Юра
Вместо загрузки всех строк в память. Только доктрина наверное не умеет с этим работать если мы говорим про орм
Юра
Потому что как минимум рилейшены построчно не сгидрировать
The Ant
дохтрину на больших объемах тока булками юзать, с постраничным итератором
Konstantin
не до конца понятно зачем. зачем тебе типа 100к сущностей?
Anton
Ну, то есть можно себе представить что нужно обработать 100к записей, но чтобы они все единовременно в памяти лежали - что-то наверное идёт не так)
Юра
Сколько пхпдоку лет?
Юра
Как можно так долго делать проект, и в итоге получилось такое убогое гно
Юра
Что даже на мобиле не отображается нормально
Anton
А зачем такое количество
Загрузить данные из xml-ки. Я как-то делал сервис, так там регулярно попадались xml-ки под полмиллиона товаров)
Юра
Загружать можно по одной сущности
Юра
И чистить entity manager
Юра
Если повезёт память не утечет )
Anton
Не, так я про это и говорил) Что в целом обрабатывать такой объем - легко, а вот держать в памяти сразу всё - странновато)
Виталий
Всем привет! Вопрос по partial селекту, если пытаюсь забрать связь oneToOne, то ловлю ошибку Error: There is no mapped field named, я так понял, это потому что partial смотрит на конкретную сущность, а у меня JoinColumn прописан в связанной, если перенести JoinColumn в нужную сущность, то падает на нулевой релейшенах, хотя в JoinColumn стоит по дефолту nullable=true, встречался кто-то с такой проблемой?
Kirill
Всем привет! А вы пишете интерфейсы для сервисов? И если да, то зачем?
Konstantin
слишком сложный и объемный вопрос
Konstantin
да пишем, но не всегда. устроит такой ответ?
Юра
Всем привет! А вы пишете интерфейсы для сервисов? И если да, то зачем?
Ну это один из принципов solid, зависимости от интерфейса а не от реализации. Тестить проще
Юра
Я не пишу
Юра
)
Юра
Двойная работа
Юра
В джаве пишут
Kirill
да пишем, но не всегда. устроит такой ответ?
Нет, я же как раз хочу понять когда и зачем пишут)
Konstantin
если у интерфейса одна и строго одна реализация - то не пишем. нет смысла в липовых интерфейсах, как там этот антипаттерн называется - interface bloating что ли
Kirill
Да, меня как раз интересует, когда одна реализация. Когда много реализация - там все понятно
Konstantin
если вдруг появляется вторая реализация, можно быстро поменять FooService в зависимостях на FooInterface
Konstantin
я по крайней мере придерживаюсь такого принципа
Юра
А как тестить если сервис принимает конкретный класс?
Юра
Я про юнит тесты
Сергей
мокать?
Юра
Типо создаётся наследник класса?
Юра
А как переопределить приватные методы
Konstantin
А как переопределить приватные методы
нельзя тестить приватные методы