• Как заставить работать COUNT с GROUP BY?

    @Dark_Dante Автор вопроса
    D3lphi, Товарищ доктринщик, расскажите пожалуйста, как запихать subQuery во FROM.
    А что же этот OutputWalker писать то надо? Что ж такой замечательный инструмент не умеет такие примитивные функции из коробки?
  • Как заставить работать COUNT с GROUP BY?

    @Dark_Dante Автор вопроса
    V Sh., COUNT возвращает не одну запись, а несколько. Как в нормальных запросах каунт работает - десять записей в ответе, он возвращает одну запись int 10. У меня же он возвращает десять (на самом деле количесвто будет зависеть от количества групп) записей с int 1 :)
    SUM(CASE WHEN o.id > 0 THEN 1 ELSE 0 END) - такая конструкция меня пугает. Думал что это можно сделать как то проще
  • Как заставить работать COUNT с GROUP BY?

    @Dark_Dante Автор вопроса
    Akina,
    Даже в самой свежей версии? хм... хороший повод задуматься о смене инструмента. С другой стороны документация утверждает, что оно "Support for both high-level and low-level database programming for all your use-cases." - так что должно в raw SQL съедать вообще всё, что способен переварить сервер БД.

    Угу, даже в самой свежей версии. Инструмент поменять нельзя - требования бизнеса такие. Было б можно - давно бы выкинул это глюкавое г.. Raw SQL тоже нельзя:) В общем так как эта штука не умеет в подзапросы, не умеет в агрегатные функции чуть ширше стандартных... Остановлюсь на варианте считать количество данных в наборе на PHP. Спасибо за помощь
  • Как заставить работать COUNT с GROUP BY?

    @Dark_Dante Автор вопроса
    SELECT COUNT(o.id) AS cnt
    FROM "order" AS o
             LEFT JOIN product p ON (p.order_id = o.id)
    GROUP BY o.id
    HAVING sum(p.price) >= 10

    Собственно, это я и имел ввиду, говоря "Как обычно пытаюсь это сделать через COUNT". Оно так не работает.

    Второй - используя средства языка программирования или библиотеки доступа, получить количество записей в наборе записей. Обычно подобное свойство у рекордсета присутствует.

    Это самый крайний и очень нежелательный способ. Получать весь набор данных (там жеж не просто будут o.id - там еще примерно, образно говоря, сто тыщ мильонов данных и столько же строк в ответе) чтобы просто их подсчитать - ну такое.

    Третий вариант это примерно как второй, плюс доктрина из коробки не знает о существовании OVER(), а подружить ее синтаксический анализатор со сторонними функциями не получается.
  • Как заставить работать COUNT с GROUP BY?

    @Dark_Dante Автор вопроса
    Dr. Bacon, больше так не буду. Понять и простить. Вообще два тега надо. Насколько знаю и с другими БД беда будет примерно та же самая
  • Как получить значение из многомерного массива php?

    @Dark_Dante
    makboriska, это такое, устаревший вариант. Приучайся писать с тайпхинтами, каллбеками и стрелочными функциями в них.
  • Как получить значение из многомерного массива php?

    @Dark_Dante
    makboriska,
    $iDs = array_map(
        fn (array $array): => $array['id'],
        $yourArray
    );


    В массиве $iDs будут только айдишники.
  • Почему создается только один Mock объект?

    @Dark_Dante Автор вопроса
    Daria Motorina, нет. Но это не влияет. Если сделать например
    'weight' => is_null($weight) ? random_int(1, 10000) : $weight,

    в setConstructor, то при дампе объект тот же, а значение свойства weight будет рандомно. Так что если и через аргументы метода значения передать, объект останется тем же, но с другими свойствами.
    Если что, несколько объектов одного класса мне необходимы чтобы создать коллекцию, а потом произвести некие манипуляции с ней. А я коллекцию создать не могу - потому что стоит проверка на уникальность объектов в коллекции.
  • Doctrine как получить расхождение двух запросов?

    @Dark_Dante Автор вопроса
    Akina, Суть в чем. Приезжают товары в контейнерах (не суть важно, важно что большой объем). Есть таблица где сведены id контейнера, id товара, количество единиц товара в контейнере. Уезжают товары в мелкой фасовке - пакеты. Есть таблица где тоже самое: id пакета, id товара, количество единиц товара в пакете. Количество контейнеров с одинаковыми товарами за одну доставку может быть любым. И количество пакетов с разными товарами тоже может быть любым. Я этим запросом делаю что... группирую все контейнеры данной доставки по id товара и делаю SUM(количество). И тоже самое с пакетами. И смотрю расхождение первого со вторым - ничего не прое... потерялось ли. Если расхождение есть - единица товара либо пролюбилась, либо добавилась неучтенная в пакете. К тому же в пакете могут быть дополнительные товары, которых не было в контейнерах. Твой вариант отработает до момента пока не появятся в пакетах эти дополнительные товары, разве нет?
  • Doctrine как получить расхождение двух запросов?

    @Dark_Dante Автор вопроса
    Сергей Доний,
    что мешает выполнить native запрос
    - чувство прекрасного. Весь код в единой стилистике с PSRами, вот этим вот всем и тут посреди кода фаршмак в виде обычного SQl - согласитесь, это некрасиво. Сущности получать не надо, мне достаточно инфы что ответ не пустой, т.е. расхождения в ответах есть. Пока я так и сделал, нативным SQL. Но гложет червь сомнения - что такая задача может решаться более изящными способами. Вариант сделать первый запрос, потом второй и сделать array_diff между ними - не предлагать :)
  • Doctrine как получить расхождение двух запросов?

    @Dark_Dante Автор вопроса
    Не совпадают. На самом деле там сложные запросы с несколькими join, агрегатными функциями, вот этим вот всем. Результат выдачи совпадает. Но не всегда. Вот и надо отловить это "не всегда". Так что обычным join эту проблему не решить. Да и вообще на будущее научиться бы как правильно в доктрину свои языковые конструкции добавлять
  • Как отловить ассинхронный php?

    @Dark_Dante Автор вопроса
    Лентяй, Эмм... что то не придумаю как это сделать.
    Пока пришла в голову такая брезовая идея
    foreach($service as $s){ //обходим массив сервисов
    //и для каждого запускаем while
         while($s->isRunning()){
        }
    }


    Получается что... сервис1. Данные не пришли. Крутим цикл. Пришли, окей, переходим к сервису2. А у сервиса2 данные раньше пришли, while даже не отработает. Переходим к сервису3... В общем по получению ответа от самого тормозного сервиса цикл foreach закончитсяи по выходу из цикла все данные уже будут получены.

    Как думаете, правильно? Заработает такой подход?
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    Denis Holub, Ну на простом примере более понятно :) Смысл то тот же остался, только масштабы другие :) Вот например узнал что примари кей можно на несколько полей ставить. А я на одно ставил, а mysql ругался типа значение неуникальное. Я аж всю голову сломал.
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    Denis Holub, А как узнать ускоряет ли индекс или замедляет работу базы? По Explain'у все поля eq_ref, кроме двух - они ref - на оба идет WHERE. В общем я туп в этом деле. Я как в тумане от непонимания структуры данных и принципах работы БД, хожу, спотыкаюсь, набиваю шишки :)
    Насчет актуальности... в принципе... можно разбить на несколько таблиц по актуальности (ну или частоте обращений). Идея хорошая, я над ней подумаю =)
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    На самом деле ситуация такая. Есть семь таблиц, которые объединены через одну, связывающую. Примерно как на схемке. Связывающая таблица состоит из, примерно, 147 млн записей. Выбирается все это дело SELECTOM с INNER JOIN'aми. И вот все это дело несчадно тормозит. Индексы на всех полях в этой связывающей таблице стоят. Вот бьюсь, чтобы ускорить выборку...
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    Может быть это как то с быстродействием связано?
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    d-stream, А зачем тогда нужны таблицы без PK? Смысл их существования?
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    Дмитрий Энтелис, d-stream, Ага, спасибо, я кажется начал понимать как это работает.
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    Melkij, Спасибо, кажется я начинаю понимать :)
  • Ставить ли primary key на связывающую таблицу?

    @Dark_Dante Автор вопроса
    А в случае моей таблицы brands_state целых два ключа?