PHP Symfony DQL - слишком мало параметров: запрос определяет 1 параметр, но вы ограничены только 0 - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь собрать SELECT в проекте хранилища Symfony, но по какой-то причине получаю сообщение об ошибке в теме. Работал над этим в течение нескольких дней, но не может найти решение с различными вариантами кода. Это код

$qb3 = $this->getEntityManager()->createQueryBuilder();
$qb3-> select('check.userid')
    -> from('App\Entity\YY_Table', 'check')
    -> where('DATE_FORMAT(now(), \'%e-%b-%Y\') - DATE_FORMAT(check.datecreated, \'%e-%b-%Y\') <=360');

$qb2 = $this->getEntityManager()->createQueryBuilder();
$qb2-> select('((:numemails1 / COUNT(subs.id)) * 10)')
    -> from('App\Entity\XX_Table', 'subs')
    -> where($qb2->expr()->notIn('subs.id', $qb3->getDQL()))
    -> setParameter('numemails1', $numemails);
$rand_num = $qb2->getQuery()->getResult();

$qb1 = $this->getEntityManager()->createQueryBuilder();
$qb1-> select('subss.id')
    -> from('App\Entity\XX_Table', 'subss')
    -> where('RAND() < :sqbresult')
    -> orderBy('RAND()')
    -> setMaxResults($numemails)
    -> setParameter('sqbresult', $rand_num);

/*primary query to select users for future campaigns*/
$qb = $this->getEntityManager()->createQueryBuilder();
$qb -> select('s')
    -> from('App\Entity\XX_Table', 's')
    -> where($qb->expr()->In('s.id', $qb1->getDQL()));
    //-> where($expr->not($expr->exists($qb1->getDQL())));
return $qb ->getQuery() ->getResult();

и я пытаюсь получить альтернативу .sql-коду ниже, чтобы выбрать случайные объекты из БД, отвечающие некоторым основным критериям

SELECT 
g.* FROM XX_table g
JOIN
    (SELECT 
         id
     FROM
         XX_table
     WHERE
         RAND() < (SELECT 
                    ((60000 / COUNT(*)) * 10) as rand_num
                   FROM
                    XX_table
                   WHERE 
                    id NOT IN (SELECT userID as id FROM YY_table emst WHERE CURDATE() - emst.datecreated <=360)
                  )
     ORDER BY RAND()
     LIMIT 60000) AS z ON z.id= g.id

Я проверил ответы здесь: Слишком мало параметров: запрос определяет 1 параметр, но вы ограничены только 0 и здесь https://github.com/stwe/DatatablesBundle/issues/685 и чувствую, что решение где-то близко, но не может добраться до него

1 Ответ

0 голосов
/ 24 августа 2018

Короткий ответ: вам нужно на самом деле позвонить:

$qb->setParameter('sqbresult', $rand_num)

перед последней строкой.На самом деле, нет причины вызывать его на $qb1, так как это в основном будет отброшено.

Причина этого в том, что в приведенном выше коде вы просто используете $qb1 в качествеМеханизм генерации DQL.Все параметры, заданные для этого, не передаются при вызове getDQL, только строковое значение DQL в этой точке.

Если бы вы были var_dump($qb->getDQL()) непосредственно перед концом, вы быувидеть что-то вроде:

SELECT s FROM App\Entity\XX_Table s WHERE s.id IN (
         SELECT subss.id FROM App\Entity\XX_Table subss
                         WHERE RAND() < :sqbresult
                         ORDER BY RAND() ASC
)

, показывающее, что :sqbresult все еще остается в DQL и, следовательно, должен иметь набор параметров.

...