Konstantin
Konstantin
вопрос слишком абстрактный, могу проконсультировать по зуму, указав конкретные библиотеки, серверы, настройки и подводные камни. но вам вряд ли цена понравится
Alexey
В доке вот прям сходу говорят "юзайте dql ибо он офигенен"
The Ant
Alexey
Верю, а про депрекейтед-то где?
Konstantin
The Ant
у меня глючит выдача с джойнами по мани-2-мани
Konstantin
а можно конкретнее? есть пример запроса?
Vladimir
ребят, кто с jql работал? как из джиры получать удаленные (архивные) таски через апи?
Konstantin
а руками поселектить в дашборде получается? прям через jql?
Konstantin
если да, то можно взять либу от баду (либо еще одна есть), там можно селектить прям jql-запросом
Vladimir
мне надо синхронизацию сделать, я делаю селект по created и updated но туда не попадают удаленные задачи
The Ant
а можно конкретнее? есть пример запроса?
https://pastebin.com/FgniX73H
Сори, маленько занят был.
Показывает какую-то хуйню, оффсеты нормальные, лимиты нормальные, а на страницу выдает по 1-10 постов, хотя должно 50 например.
Konstantin
так, а где там dql?
The Ant
генерица квери билдером же
Konstantin
не, погоди, в разрезе дискуссии выше dql - это способ написания запросов на sql-like языке. ему противопоставляют qb. и типа вечный спор как лучше писать запросы - через qb или dql. у тебя же тут какая-то достойная лапша, которая делает хер знает что, но всё же, в основе использует qb
The Ant
квери билдер не от дбала там, а другой какой-то, он генерит тот самый dql
The Ant
есть даже метод getDql()
Konstantin
не берусь спорить, но qb и dql - это два параллельных способа сформировать запрос к базе в некоем внутреннем формате представления доктрины (то что она в дбал сунет потом в виде всяких массивов). то есть qb (именно доктриновый) ничего про dql не знает и наоборот, это два именно что параллельных способа
Konstantin
у тебя же твой (не разбирался) qb должен не dql генерить (это слегка абсурдно звучит - вместо машиночитаемого composable-формата, что дает доктриновый qb использовать генерацию человекочитаемого dql, чтобы потом опять его в машиночитаемое представление сконвертить)
The Ant
да почему параллельных то? дкл парсится и преобразуется в хрень для дбала
The Ant
просто еще один уровень абстракции под нужды орм
Konstantin
хотя мож вру, кстати
The Ant
$this->em
->getRepository(Post::class)
->createQueryBuilder('p');
он не мой, он от ентити манагера
Konstantin
но опять же - это всё не по теме вопроса. мы тут за то, как писать запросы: через $qb->select(...)->from(...)->where или же SELECT e FROM App\Entity\Foo e WHERE e.... = :bar
The Ant
никак, чистый скул писать.
Потому что как тока надо кучу джойнов и фильтрацию не сложную, крайне. Оно начинает исполнять какую-то дичь
The Ant
мож я конечно чето не так делаю, я хз. Но вроде там косяков у меня нету, а баги есть.
Konstantin
не могу согласиться, в коде выше явно другие проблемы (он лапшеват и нетестируем)
Konstantin
дкл бесит тем, что ты материшься понять как в нем относительно сложный запрос написать
The Ant
в смысле лапшеват? в чем лапша? в применении опций фильтра? какие есть альтернативы?
Konstantin
ну чисто визуально - это приватный метод, который делает хер пойми что. ну то есть понятно что он фильтрует что-то там, но он правда довольно сложно читаем
The Ant
если есть материалы по написанию кода для больших фильтров с удовольствием почитаю 😄
The Ant
пока что я видел тока кучу ифов и свитчей
The Ant
ну можно еще какой пайплайн сделать для каждой опции, но всё равно будет какая-то хрень
Юра
Если нужно билдить запрос испльзуйте квери билдер, если просто написать несложный запрос, юзайте dql
Юра
Ваш кеп
Юра
Не забываем про KISS
Юра
Konstantin
да, и правда, никогда об этом не знал, честно говоря
Юра
То что у него есть метод getSql, значит просто что он сначала делает dql и из него sql
Konstantin
не могу придумать зачем
Юра
Зачем билдер?
Konstantin
зачем из него dql
Юра
Странный вопрос )
Юра
Потому что он билдит dql
Юра
Чтобы ты не писал руками конкатенации строк
Юра
Или вот тебе надо дать возможность менять dql
Юра
Как это сделать без билдера?
Юра
В итоге к такому же билдеру прийдёшь
Юра
У дбал есть свой билдер
Юра
Если кто не знал )
Сергей
Dmitry
https://pastebin.com/FgniX73H
Сори, маленько занят был.
Показывает какую-то хуйню, оффсеты нормальные, лимиты нормальные, а на страницу выдает по 1-10 постов, хотя должно 50 например.
Это не проблема квери-билдеров, а фишка самого SQL.
Запрос с JOIN-ами по ToMany:
SELECT posts LEFT JOIN comments WHERE ... ORDER BY date LIMIT 5
выведет пять комбинаций с повторами постов:
1, 'Post 1', 1, 'Comment 1'
1, 'Post 1', 2, 'Comment 2'
1, 'Post 1', 4, 'Comment 4'
2, 'Post 2', 3, 'Comment 3'
2, 'Post 2', 5, 'Comment 5'
из которых в результате получается всего два поста.
Потому все такие фильтры по ToMany вместо JOIN-ов нужно делать подзапросами вроде:
SELECT posts WHERE EXISTS (SELECT comments WHERE ...) ORDER BY date LIMIT 5
Тогда с LIMIT и COUNT(*) проблем не будет.
Кирилл
Кирилл
и не надо все поля указывать
The Ant
Это не проблема квери-билдеров, а фишка самого SQL.
Запрос с JOIN-ами по ToMany:
SELECT posts LEFT JOIN comments WHERE ... ORDER BY date LIMIT 5
выведет пять комбинаций с повторами постов:
1, 'Post 1', 1, 'Comment 1'
1, 'Post 1', 2, 'Comment 2'
1, 'Post 1', 4, 'Comment 4'
2, 'Post 2', 3, 'Comment 3'
2, 'Post 2', 5, 'Comment 5'
из которых в результате получается всего два поста.
Потому все такие фильтры по ToMany вместо JOIN-ов нужно делать подзапросами вроде:
SELECT posts WHERE EXISTS (SELECT comments WHERE ...) ORDER BY date LIMIT 5
Тогда с LIMIT и COUNT(*) проблем не будет.
Уии2 эктив рекорд такое как-то решал в своем квери билдере, а доктриновский не в состоянии
Dmitriy
Доктрина умеет такое, она склеивает такие записи
Kirill
The Ant
стартовый запрос, без группировок
The Ant
походу надо уиишный эктив рекорд тащить в проект для чтения 🤣🤣
нахер эту доктрину, нахер ручные склейки сущностей...
Dmitry
The Ant
там 2 варианта: включить и исключить
Dmitry
Dmitry
Ну вот смотрю свой бородатый проект, там без проблем всё показывает. без дублей как у тебя в примере.
Для избавления от дублей это решалось через SELECT DISTINCT или агрегацию GROUP BY (id) LIMIT 5, но теперь в строгом режиме это заставит сделать агрегации по всем полям.
Вместо этого можно от агрегации избавиться, обернув все фильтры с агрегацией и джойнами в запрос постов по id IN или EXISTS, применив ORDER BY и LIMIT сверху:
SELECT * FROM posts WHERE id IN (SELECT id FROM posts JOIN ... WHERE ...) ORDER BY date LIMIT 5
The Ant
Dmitry
The Ant
не уверен насчет подзапроса, но если передать вручную параметры то отсортирует, по крайней мере в мускле
Dmitry
Andrei
Коллеги, привет! Продолжаю ковырять доктрину, и внезапно вижу что она не хочет работать с родным для сифони Symfony\Component\Uid\Uuid; и желает только Ramsey\Uuid\Uuid; - почему так?
Юра
Почему не хочет
Юра
Может настроения нет у неё
Andrei
Т.е. пытаясь пехать в find репозитория Uuid от симфони а не от Ramsey я делаю это без уважения?)
Nikolay
Andrei
Nikolay