2014-06-11 1 views
1

내가 (실패) 시도하고 적용 할 때 :서버 충돌이 수행하는 복잡한 교리의 하위 쿼리

가 DQL에서
SELECT AVG (DISTINCT(DATEDIFF(E1.updated_date, E2.updated_date))) FROM 

(SELECT DISTINCT e1_.updated_date, e2_.id as id FROM engineering_details e1_ INNER JOIN engineerings e2_ ON e1_.engineering_id = e2_.id INNER JOIN projects p4_ ON e2_.project_id = p4_.id INNER JOIN `lines` l5_ ON e2_.line_id = l5_.id INNER JOIN statuses s6_ ON e1_.to_status_id = s6_.id WHERE e2_.Rev_asignee = 'Test User 1 [Eduardo Monto]' AND p4_.id = 8 AND l5_.id = 1 AND e2_.out_of_plan = 0 AND e1_.updated_date >= '2014-01-01' AND e1_.updated_date <= '2014-06-11' AND s6_.id = 16) as E1, 

(SELECT DISTINCT e1_.updated_date, e2_.id as id FROM engineering_details e1_ INNER JOIN engineerings e2_ ON e1_.engineering_id = e2_.id INNER JOIN projects p4_ ON e2_.project_id = p4_.id INNER JOIN `lines` l5_ ON e2_.line_id = l5_.id INNER JOIN statuses s6_ ON e1_.to_status_id = s6_.id WHERE e2_.Rev_asignee = 'Test User 1 [Eduardo Monto]' AND p4_.id = 8 AND l5_.id = 1 AND e2_.out_of_plan = 0 AND e1_.updated_date >= '2014-01-01' AND e1_.updated_date <= '2014-06-11' AND s6_.id = 38) AS E2 

WHERE E1.id = E2.id 

지금까지 내가 '번역'한에 내가 무슨 생각을가 DQL의를 위의 SQL과 동일합니다. createQueryBuilder 대신 createQuery을 사용했지만 '서브 쿼리'를 적용하는 유일한 방법 이었으므로 대신 createQueryBuilder으로 변경되었습니다. createQuery를 사용할 때 나는 그래서

'을 (를) 찾을 수 없습니다 CLASS ('의 오류, 내가 뭘 가지고

$qb = $em->createQueryBuilder(); 
      $query = $qb->select('SELECT AVG(DISTINCT(DATEDIFF(E1.updatedDate, E2.updatedDate))) AS AVGTREV') 
        ->from($qb->select('SELECT DISTINCT T1.updatedDate, eng.id as id HW\Bundle\EngMgmtBundle\Entity\EngineeringDetail T1 INNER JOIN T1.engineering eng INNER JOIN eng.project p INNER JOIN eng.line l INNER JOIN T1.toStatus ts WHERE eng.ReviewAsignee = :eng AND ts.id = 16 
AND p.id = :project_id AND l.id = :line_id AND eng.outOfPlan = 0 AND T1.updatedDate >= :period_from AND T1.updatedDate <= :period_to'), 'E1') 
        ->from($qb->select('SELECT DISTINCT T2.updatedDate, eng.id as id HW\Bundle\EngMgmtBundle\Entity\EngineeringDetail T2 INNER JOIN T2.engineering eng INNER JOIN eng.project p INNER JOIN eng.line l INNER JOIN T2.toStatus ts WHERE eng.ReviewAsignee = :eng AND ts.id = 38 
AND p.id = :project_id AND l.id = :line_id AND eng.outOfPlan = 0 AND T2.updatedDate >= :period_from AND T1.updatedDate <= :period_to'), 'E2') 
        ->setParameters(array('project_id' => $project, 'line_id' => $line, 'eng' => $user->getName(), 'period_from' => $period_from, 'period_to' => $period_to)) 
        ->getQuery(); 
      $entities = $query->getResult(); 

내가 그러나 내가 할 수없는 '에서'2를 사용하지 않아야 알고 있어요 나는 인터페이스를 통해 쿼리를 만들려고 할 때 주요 선택은 두 개의 하위 쿼리에서 결과를 사용하기 때문에, 그렇지 않으면 그것을 할 수있는 방법을 찾을 것 같다. 그래서

을, 그것은 그것을 유지, 오류가 발생하지 않지만, '로딩'을 클릭 한 다음 '웹 사이트를 사용할 수 없음'으로 변경합니다 ... 문의하신 내용이 확실합니다. 무엇이 잘못 되었나요?

답변

0
$sql = "SELECT AVG (DISTINCT(DATEDIFF(E1.updated_date, E2.updated_date))) AS AVGTREV FROM 

(SELECT DISTINCT e1_.updated_date, e2_.id as id FROM engineering_details e1_ INNER JOIN engineerings e2_ ON e1_.engineering_id = e2_.id INNER JOIN projects p4_ ON e2_.project_id = p4_.id INNER JOIN `lines` l5_ ON e2_.line_id = l5_.id INNER JOIN statuses s6_ ON e1_.to_status_id = s6_.id WHERE e2_.Rev_asignee = :engineer AND p4_.id = :project AND l5_.id = :line AND e2_.out_of_plan = 0 AND e1_.updated_date >= :begin_date AND e1_.updated_date <= :end_date AND s6_.id = 16) as E1, 

(SELECT DISTINCT e1_.updated_date, e2_.id as id FROM engineering_details e1_ INNER JOIN engineerings e2_ ON e1_.engineering_id = e2_.id INNER JOIN projects p4_ ON e2_.project_id = p4_.id INNER JOIN `lines` l5_ ON e2_.line_id = l5_.id INNER JOIN statuses s6_ ON e1_.to_status_id = s6_.id WHERE e2_.Rev_asignee = :engineer AND p4_.id = :project AND l5_.id = :line AND e2_.out_of_plan = 0 AND e1_.updated_date >= :begin_date AND e1_.updated_date <= :end_date AND s6_.id = 38) AS E2 

WHERE E1.id = E2.id"; 
      $params = array('engineer' => $user->getName(), 'project' => $project, 'line' => $line, 'begin_date' => $period_from, 'end_date' => $period_to); 
      $em = $this->getDoctrine()->getManager(); 
      $stmt = $em->getConnection()->prepare($sql); 
      $stmt->execute($params); 
      $entities = $stmt->fetchAll(); 

나는이 전적으로 불편 해요하지만 내가 할 수있는 방법을 찾을 수 없습니다 기본 $의 SQL을 사용했다 그것은 교리와 관련이 있습니다. @ Kapil의 대답에 감사드립니다.

1

Doctrine 2는 createQueryBuilder를 사용한 복잡한 쿼리를 지원하지 않습니다. ResultSetMapping과 함께 네이티브 쿼리를 사용해야합니다. createQueryBuilder는 문제를 일으키는 객체의 모든 결과를 변환합니다. 문제가 발생하지 않도록하려면 원시 쿼리를 시도하십시오.

참조 용으로 아래 링크를 참조하십시오. http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html

1

또는 당신 같은 교리의 DBAL를 사용할 수 있습니다

$query = "SELECT " ; // your query 

// dbal connection from your controller 
$conn = $this->container->get('doctrine.dbal.default_connection'); 

// dbal connection from your entity repository 
$conn = $this->getEntityManager()->getConnection(); 

$results = $conn->fetchAssoc($query);