@bondle

Как будет выглядеть запрос с QueryBuilder?

Есть sql запрос
SELECT game.* FROM game f 
            JOIN ( SELECT RAND() * (SELECT MAX(id) FROM game) AS max_id ) AS m 
            JOIN game_buffer on game_buffer.game_id = f.id 
        WHERE f.id >= m.max_id and f.`start_time` between :from 
          and  :to and game_buffer.source_id = :source ORDER BY f.id LIMIT 1

Хотелось бы для его формирования использовать QueryBuilder, но понятия не имею как сделать join
JOIN ( SELECT RAND() * (SELECT MAX(id) FROM game) AS max_id ) AS m
  • Вопрос задан
  • 113 просмотров
Решения вопроса 2
@Flying
Напрямую - никак, поскольку в DQL нет функции RAND(). Если хотите - можете добавить свою.

Также, хотя подзапросы и можно сделать через QueryBuilder, но получившаяся конструкция будет выглядеть весьма странно. Кроме того важно помнить что QueryBuilder - это инструмент формирования запроса, к примеру если вам надо добавлять какие-то части запроса в зависимости от логики приложения. Если сам запрос статический - то вполне можно напрямую использовать DQL т.к. QueryBuilder компилируется именно в него.
Ответ написан
Комментировать
@bondle Автор вопроса
В дополнению к прошлому - нагуглил, что doctrine не поддерживает подзапрос, поэтому пришлось калдовать, получилось так:
$conn = $this->getEntityManager()->getConnection();

        // doctrine not support rand() and subqueries
        $stmt = $conn->prepare('select RAND() as rand');
        $stmt->execute();
        $random = $stmt->fetchColumn();

        $stmt = $conn->prepare('SELECT MAX(id) as id FROM game');
        $stmt->execute();
        $max = $stmt->fetchColumn();
        $randomId = $random * $max;


        $qb = $this->createQueryBuilder('g')
            ->join('App\Entity\GameBuffer', 'gb')
            ->where('g.id >= :maxId')
            ->andWhere('g.startTime > :from')
            ->andWhere('g.startTime < :to')
            ->andWhere('gb.source = :source')
            ->setParameters([
                'from' => '2020-07-28 10:53:46',
                'to' => '2020-07-28 12:53:46',
                'maxId' => $randomId,
                'source' => 1
            ])
            ->orderBy('g.id', 'asc')
        ->setMaxResults(1);

        $query = $qb->getQuery();
        $res = $query->execute();

        return count($res) > 0 ? $res[0] : null;


Сначала получает случайное число через mysql, потом максимальный id, перемножаем и делаем запрос с готовыми данными.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы