Юра
Мне кажется или тут что-то странное в CsvEncoder симфонийском?
Юра
Юра
а там value по ссылке
Юра
отбой )
Юра
не мне показалось что $flattened нигде не используется
Кирилл
а там value по ссылке
По ссылке на что?
Юра
на элемент массива
Кирилл
А
Юра
Короче крайне неэффективный энкодер
Юра
Весь датасет пробегает два раза
Null
Ссылка в фориче ваще дурной тон. Для таких целей array walk самое то.
Gleb
Ссылка в фориче ваще дурной тон. Для таких целей array walk самое то.
А почему ссылка в фориче считается дурным тоном? То что в целом явную передачу по ссылке считается что лучше уже не делать? Передача по ссылке идёт и в самом array_walk. Foreach только ближе к императивному стилю, а array_walk к функциональному. По мне для phpшников наверное ближе всё-таки foreach, хотя там и есть подколка с сохраняющейся ссылкой на последний элемент.
Null
Так в нем и дело.
Null
В foreach любят $key => $value. А потом у тебя дальше снова форич с такими же переменными. А первые были ссылками. И все. Ты случайно меняешь массив.
Gleb
Это обычно до первого применения ссылки в foreach) а дальше снова внимательно читается гугл или дока.)
Null
А вот array_walk такую ошибку не даст сделать)
Gleb
Ну и по хорошему при нормальном именовании переменных, даже в foreach такая ситуация больше исключена)
Gleb
А вот array_walk такую ошибку не даст сделать)
Ну как же без ошибок?) А как же постигать мудрость и потирать шишку на лбу от грабель?))))
Gleb
Спасибо, я понял что за сайд-эффект не считается хорошей практикой.
Viktor
Ребят, всем привет! Может кто-нибудь помочь с составление запроса в Doctrine Query Builder? Мне нужен супер простой запрос: select count(*) from (select city, breed from new_sell_request as nsr group by city, breed) as test; То есть count из subselect. Что-то в гугле ничего толкого найти не могу( Заранее спасибо!
Viktor
может все такие какие то другие способы есть?:)
Denis
через native sql
Vlad
не мучай себя и делай через чистый скуль
Viktor
Спасибо:) В итоге так и сделал. Там нюанс, что subselect может насыщаться условиями, поэтому на чистом sql не хотел бы писать.
Viktor
$rsm = new ResultSetMappingBuilder($this->getEntityManager()); $rsm->addScalarResult('count', 'cnt'); $subquery = $this->createQueryBuilder('nsr') ->select('nsr.city') ->addSelect('nsr.breed') ->groupBy('nsr.city') ->addGroupBy('nsr.breed'); $subquery = $this->addCitySellRequestsWithBreedersFilter($subquery, $request); $query = $this->getEntityManager()->createNativeQuery( 'SELECT COUNT(*) FROM (' . $subquery->getQuery()->getSQL() . ') as test1', $rsm )->setParameters($subquery->getParameters()); $query->getSingleScalarResult()
Viktor
рабочий вариант)
Кирилл
рабочий вариант)
А почему всё нативкой не написать? Проще же и удобнее
Viktor
А почему всё нативкой не написать? Проще же и удобнее
а как нативкой динамически добавлять WHERE удобно? через $query .= ' AND ... '?
Viktor
блин, ну не знаю. готов собрать мнения:) я как-то привык использовать инструмент, если он есть) есть ли понимание, что мое решение работает хуже / медленнее? Просто у меня сейчас уже готов отдельный метод, который динамически насыщает этот WHERE. Если полностью перейти на нативку, то придется полностью продублировать этот готовый метод, но без использования QB.
Сергей
я например непонимаю людей, которые используют везде билдер даже где это очень неудобно( типа подзапросы ), потому что он есть. это не фига не читабельно как минимум)
Сергей
Мы делаем примерно так (очень утрированный пример), билдер в работе практически не используем, проще с чистым SQL работать.
Сергей
В чужих кодах много попадается примерно таких вариантов
Alexey Mishurovskiy
есть пул запросов, в частности всякие статистики и аггрегаты, где его использовать действительно неудобно..
Alexey Mishurovskiy
Но то что на скринах выше, это какой-то треш.. мы не будем использовать билдер, мы напишем свой билдер на конкатенации со 100500 if-ами
Сергей
В 90% случаев если не получается использовать билдер, значит что-то уже идет не так.
ХЗ, часто требеутся делать нетривиальные выборки для отчетов или каких то эксклюзивных интерфейсах аналитики, без этого никак
Юра
Лучше в массив добавлять строки и имплотидь, не надо будет вырезать and or
Юра
Раз уж свой билдер пошел )
Сергей
Но то что на скринах выше, это какой-то треш.. мы не будем использовать билдер, мы напишем свой билдер на конкатенации со 100500 if-ами
Это был упрощенный пример, для демонстрации подхода. На деле билдятся всякие джойны-кросджойны, подвыборки. На кверибилдере долбанешся такое делать и не поймешь ничего потом, кучу коментов придется написать. А тут чистые запросы, проще понять что приоисходит.
Юра
wordpress like
sham_post_meta )
Viktor
вообще ещё как вариант можно в самой бд функцию сделать и вызывать её с нужными параметрами
Ох, мне кажется, что функции и триггеры на уровне БД - это как-то супер не прозрачно:) Потом не вспомнить
Denis
Ох, мне кажется, что функции и триггеры на уровне БД - это как-то супер не прозрачно:) Потом не вспомнить
посмотрев запрос в репозитории, всё быстро вспомнится. а если пользоваться этим постоянно, то и не забудешь про такой вариант) зато может быть очень удобно порой. ну тут ещё есть всякие соображения должна бы быть логика в бд и т.п...
Viktor
Но вообще, согласен, естественно. Просто тут хочется использовать QB, когда запрос динамический, в зависимости от каких-то входных параметров.
Denis
там прям в начале https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/reference/query-builder.html#the-querybuilder
Denis
да там обычно ничего интересного, примеры как пользоваться дальше))))
Юра
Короче если ты ловишь себч на том что тебе приходится конкатенировать строки запроса в зависимости от параметров это индикатор что возможно нужен квери билдер
Юра
А если использовать с ним еще экспрешны то читаемость еще лучше и ошибок сложнее наделать
Павел
вообще в документации доктрины написано, что query builder лучше не использовать, это лишние затраты ресурсов. пользуйтесь им если только не знаете как написать запрос, а так лучше использовать dql
Там написано только что это абстракция над построением. Про ресурсы там ничего нет. А проще и читабельнее - это субъективщина. По мне qb проще читать и писать. А когда вижу что пишут dql в котором прописывают путь до сущности в строке, вообще считаю маразмом, так как это совершенно не подается рефакторингу и сплошная копипаста. Ну и автокомплит на стороне qb)
Павел
Про ресурсы в faq написано, по ссылке
Ага а faq есть, но это экономия на спичках.
Denis
Ну да. А в целом, костыль для костыля)))
Alexey Mishurovskiy
Парни, помогите с логгером
Alexey Mishurovskiy
Вроде стоят исключения, но исключенные каналы все равно сыпятся в логгер
Alexey Mishurovskiy
в мануале нашел вот что : The channels configuration only works for top-level handlers. Handlers that are nested inside a group, buffer, filter, fingers crossed or other such handler will ignore this configuration and will process every message passed to them.
Alexey Mishurovskiy
я же правильно понимаю, что для каждого канала мне надо сделать finger_crossed handler, настроить и уже из каждого отправлять в logstash?
Сергей
там же отдельным полем будет идти канал
Юра
Тебе каналы нало в main добавить получается
Сергей
если вопрос в разделении логов типа
Alexey Mishurovskiy
только не понял для чего?
Для управления уровняни логгирования разных каналов
Alexey Mishurovskiy
Тебе каналы нало в main добавить получается
поменял вот так. пока не проверил.
Сергей
ааа.. а почему не сразу в stdout с нужным каналом + уровнем?
Alexey Mishurovskiy
ааа.. а почему не сразу в stdout с нужным каналом + уровнем?
Ну finger_crossed копит в буфере потом кидает пачкой
Сергей
ну для буффера отдельный хендлер есть. фингер кроссед немного же для другого. буфферезирует, чтобы кинуть пачкой, если под уровень подойдет. то есть главный смысл в том, чтобы в stdout пачкой писать?
Юра
Фингер крос нужен чтобы в случае ошибки дать дебаг инфу перед ошибкой
Сергей
ну да . в его случае , если будет хотя бы info
Юра
Ну да непонятно
Сергей
коорче у меня ощущение, что он тут не нужен
Юра
Чтобы разделить по каналам не нужен фингер крос