Symfony - Создание сложных запросов с использованием Doctrine - PullRequest
0 голосов
/ 05 сентября 2018

Каков наилучший способ создания более сложных запросов с использованием Doctrine в Symfony? Например, мне нужен запрос, который будет иметь 3 параметра, два AND и одно вложенное условие OR. В mySQL это будет выглядеть примерно так:

        SELECT *
        FROM schedule sched
        WHERE shed.date = '01-01-2018'  --first parameter
        AND (sched.timefrom BETWEEN 8 AND 12   -- second and third parameter
        OR sched.timeto BETWEEN 8 AND 12)      -- also second and third

Я пытался разными способами, но ничего не работает:

  $query = $em->createQuery(
        'SELECT sched
         FROM schedule sched
         WHERE shed.date = :d
         AND (sched.timefrom BETWEEN :tf AND :tt
         OR sched.timeto BETWEEN :tf AND :tt)'
       ) ->setParameters(['d' => $date->format('Y-m-d'), 'tf' => $timefrom, 'tt' => $timeto]);

это не сработало, даже если я заменил МЕЖДУ на полное состояние, например:

     (sched.timefrom > :tf AND sched.timefrom < :tt)

Использование QueryBuilder также не работало, и я попытался несколькими способами, это был последний (также пробовал с expressionBuilder, тоже не работал):

      $repository = $this->getDoctrine()->getRepository(schedule::Class);
      $query = $repository->createQueryBuilder('sched');
      $query->where('sched.date = :date AND ((sched.timefrom > :timefrom AND sched.timefrom < :timeto) OR (shced.timeto > :timefrom AND sched.timeto < :timeto))')
      ->setParameter('date', $date->format('Y-m-d'))
      ->setParameter('tf', $timefrom)
      ->setParameter('tt', $timeto);
       $query = $query->getQuery();

также:

      $repository = $this->getDoctrine()->getRepository(schedule::Class);
      $query = $repository->createQueryBuilder('sched');
      $query->where('sched.date = :date')
      ->andWhere('sched.timefrom > :timefrom AND sched.timefrom < :timeto') 
      ->orwhere('sched.timeto > :timefrom AND sched.timeto < :timeto')
      ->setParameter('date', $date->format('Y-m-d'))
      ->setParameter('tf', $timefrom)
      ->setParameter('tt', $timeto);
       $query = $query->getQuery();

Как вы создаете запрос, который имеет много OR и AND, а также несколько скобок? Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Проблема с первой версией - запрос

(sched.timefrom BETWEEN :tf AND :tt
     OR sched.timeto BETWEEN :tf AND :tt)

должно быть

((sched.timefrom BETWEEN :tf AND :tt)
     OR (sched.timeto BETWEEN :tf AND :tt))

Основная проблема со второй и третьей версиями заключается в настройке параметров, так как в запросе вы использовали :timefrom и :timeto, но при настройке tf и tt. Я предпочитаю использовать BETWEEN. Это

$query->where('sched.date = :date AND ((sched.timefrom > :timefrom AND sched.timefrom < :timeto) 
               OR (shced.timeto > :timefrom AND sched.timeto < :timeto))')
  ->setParameter('date', $date->format('Y-m-d'))
  ->setParameter('tf', $timefrom)
  ->setParameter('tt', $timeto);

должно быть

$query->where('sched.date = :date AND ((sched.timefrom BETWEEN :timefrom AND :timeto) 
              OR (shced.timeto BETWEEN :timefrom AND :timeto))')
  ->setParameter('date', $date->format('Y-m-d'))
  ->setParameter('timefrom', $timefrom)
  ->setParameter('timeto', $timeto);

Попробуй это. Надеюсь, это поможет!

  $repository = $this->getDoctrine()->getRepository(schedule::Class);

  $query = $repository->createQueryBuilder('sched')
  ->where('sched.date = :date')
  ->andWhere('(sched.timefrom BETWEEN :timefrom AND :timeto) 
              OR (sched.timeto BETWEEN :timefrom AND :timeto)')
  ->setParameter('date', $date->format('Y-m-d'))
  ->setParameter('timefrom', $timefrom)
  ->setParameter('timeto', $timeto);
   $query = $query->getQuery();
0 голосов
/ 05 сентября 2018

Вы ищете что-то подобное?

  $repository = $this->getDoctrine()->getRepository(schedule::Class);
    $q = $repository->createQueryBuilder('sched');
    $expr = $q->expr();

    $exprQuery =
        $expr->andX(
            $expr->eq('sched.date',$date-format('Y-m-d')),
            $expr->orX(
                $expr->between('sched.timefrom',$timefrom,$timeto),
                $expr->between('sched.timeto',$timefrom,$timeto)
            )
        );

    $q->where($exprQuery);
    $q = $q->getQuery();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...