В дополнению к прошлому - нагуглил, что 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, перемножаем и делаем запрос с готовыми данными.