сложный конструктор запросов symfony2

Мне нужно знать, как лучше всего это сделать... У меня есть таблица в моей базе данных, для этого поста мы назовем ее TC, в ней есть только несколько полей, которые меня интересуют:

id, daydate, noteBy_id, and totaltime

noteBy_id назначается пользовательской таблице, в которой снова есть только несколько элементов, которые я ищу...

id, first_name, last_name, user_name, department, parentcompany

отдел ссылается на еще одну третью таблицу, в полях которой есть только id и departmentName...

Используя построитель запросов, я создал это до сих пор:

$query = $qb->select('t', 'u')
->leftJoin('t.noteBy', 'u', 'WITH', 'u.id = 't.noteBy')
->where('t.daydate BETWEEN :start AND :end')
->andWhere('u.parentcompany = :pid')
->andWhere('u.department = :dep)
->groupBy('u.id')
->setParameter('start', $start)
->setParameter('end', $end)
->setParameter('dep', $department)
->getQuery();

Теперь этот запрос работает как есть, но возвращает это:

Array
(
    [0] => Array
        (
            [id] => 6
            [in1] => DateTime Object
                (
                    [date] => 2012-04-17 09:10:00
                    [timezone_type] => 3
                    [timezone] => America/Denver
                )

            [out1] => 
            [in2] => 
            [out2] => 
            [in3] => 
            [out3] => 
            [totaltime] => 0.00
            [daydate] => DateTime Object
                (
                    [date] => 2012-04-17 09:10:00
                    [timezone_type] => 3
                    [timezone] => America/Denver
                )

            [noteBy] => Array
                (
                    [username] => j
                    [usernameCanonical] => j
                    [email] => [email protected]
                    [emailCanonical] => [email protected]
                    [enabled] => 1
                    [salt] => 
                    [password] =>     
                    [credentialsExpired] => 
                    [credentialsExpireAt] => 
                    [id] => 124
                    [full_name] => 
                    [first_name] => J
                    [last_name] => B
                    [socialsecurity] => 
                    [phone] => 
                    [phone2] => 
                    [address1] => 
                    [address2] => 
                    [city] => 
                    [state] => 
                    [zip] => 
                    [startdate] => 
                    [notes] => 
                )

        )

)

Что неверно, потому что у него есть только 1 элемент, тогда как в запущенном запросе он должен иметь 2 в базе данных.

Как это должно выглядеть:

[0]
  (
  [id] => '1'
  [first_name] => 'j'
  [last_name] => 'b'
  [username] => 'jb'
  [department] => 'some department'
  [total_time] => SUM of all records in TC.total_time for user id 1
)
[1]
  (
  [id] => '2'
  [first_name] => 'frank'
  [last_name] => 'blew'
  [username] => 'fb'
  [department] => 'some department'
  [total_time] => SUM of all records in TC.total_time for user id 2
)

Но в результирующем массиве должны быть только записи, если идентификатор пользователя имеет хотя бы 1 совпадение в таблице TC... Приветствуется любая помощь в выяснении этого запроса.


person Justin    schedule 24.04.2012    source источник
comment
Что такое $qb в вашем третьем отрывке? Если вы используете $qb = $this->createQueryBuilder('t');, вы можете попробовать использовать $$qb = $this->_em->createQueryBuilder();, так как теперь у вас есть чистый queryBuilder, где createQueryBuilder регистрирует выбор для вас, что затрудняет использование собственного выбора.   -  person Sgoettschkes    schedule 25.04.2012


Ответы (1)


В итоге я отказался от QueryBuilder и пошел с обычным запросом...

Теперь функция выглядит так:

public function indexAction($start = null, $end = null) {
        $request = $this->get('request');
        /**
         * The following 4 lines, are to default the date to Sunday through Saturday of PREVIOUS WEEK
         */
        $department = null;
        $em = $this->getDoctrine()->getEntityManager();
        $user = $this->get('security.context')->getToken()->getUser();

        $dateRangeForm = $this->createForm(new TimeClockReportType());
        if ($request->getMethod() == "POST") {
            $dateRangeForm->bindRequest($request);
            $formData1 = $dateRangeForm->getData();

        }
        if ($request->getMethod() == "POST" && $formData1['salesCompany']->getDepartmentName() != NULL ) {
            $formData = $dateRangeForm->getData();
            $start = $formData['dateRange']['startDate'];
            $end = $formData['dateRange']['endDate'];
            $department = $formData['salesCompany']->getDepartmentName();
            $query = "SELECT SUM(t.totaltime) AS total_time, u.id, u.first_name, u.last_name, u.username, d.departmentName
                     FROM EcsCrmBundle:TimeClock t
                     LEFT JOIN t.noteBy AS u
                     LEFT JOIN u.employeeDepartment AS d
                     WHERE t.noteBy = u.id
                     AND u.employeeDepartment = :dep
                     AND t.daydate BETWEEN :start AND :end
                     AND u.parentcompany = :pid
                     HAVING total_time > 0";
            $query = $em->createQuery($query)
                ->setParameter('start', $start)
                ->setParameter('end', $end)
                ->setParameter('pid', $user->getParentcompany())
                ->setParameter('dep', $department);
        } else {
            if ($request->getMethod() == "POST") {
                $formData = $dateRangeForm->getData();
                $start = $formData['dateRange']['startDate'];
                $end = $formData['dateRange']['endDate'];
            } else {
                $today = strtotime('-7 day', time());
                $end = date("Y-m-d 23:59:59", strtotime('next saturday', $today));
                $start = date("Y-m-d 00:00:00", strtotime('last sunday', $today));
            }


            $query = "SELECT SUM(t.totaltime) AS total_time, u.id, u.first_name, u.last_name, u.username, d.departmentName
                     FROM EcsCrmBundle:TimeClock t
                     LEFT JOIN t.noteBy AS u
                     LEFT JOIN u.employeeDepartment AS d
                     WHERE t.noteBy = u.id
                     AND t.daydate BETWEEN :start AND :end
                     AND u.parentcompany = :pid
                     GROUP BY u.id
                     HAVING total_time > 0";
            $query = $em->createQuery($query)
                        ->setParameter('start', $start)
                        ->setParameter('end', $end)
                        ->setParameter('pid', $user->getParentcompany());

        }
        $entity = $query->getResult();
        return $this->render('EcsCrmBundle:Reports:TimeClockReport.html.twig', array(
            'entity' => $entity,
           'start' => $start,
            'end' => $end,
            'dep'  => $department,
            'form' => $dateRangeForm->createView(),
        ));
    }

Это не самая красивая функция в мире, но пока она будет работать, а позже я немного улучшу ее, чтобы немного почистить...

person Justin    schedule 25.04.2012