2014-05-15 3 views
1

심포니에서 수천 줄의 테이블을 생성 할 것으로 예상되는 백엔드 페이지를 만들어야합니다.심포니에서 거대한 테이블 렌더링

정상적으로 이것은 좋지 않습니다. 그러나이 경우 페이지를 웹 사이트 외부로 데이터를 내보내는 방법으로 사용하기 때문에이 경우 페이징 버튼과 유사한 항목을 추가 할 수 없습니다. 즉, 렌더링 시간이 오래 걸리는 경우 중요하지 않지만 표시 될 때이 페이지에는 필요한 모든 데이터가 포함되어야합니다. 그런 다음이 페이지를 액세스 할 수있는 유일한 사용자로 제한하여 잠재적 보안 문제를 처리합니다.

그러나 심포니 MVC 구조체에 의존하는 경우 모든 데이터를 나뭇 가지 템플릿으로 보내기 전에 버퍼에 저장해야하기 때문에 메모리 오류가 발생합니다.

메모리 제거 문제없이이 페이지를 렌더링하는 간단한 방법이 있는지 알고 계십니까? 보통 PHP에서는 쿼리의 결과 중 일부를 추출하고 매번 테이블의 일부를 렌더링하는 반복을 만들었지 만 심포니 컨트롤러 -> 나뭇 가지 템플릿 구조를 따라 뭔가 비슷한 작업을 수행 할 수 있습니까?

+1

참조하십시오. 일반적으로 doctrine dql/query builder에 새 쿼리를 작성할 수 있습니다. 그런 다음'getresults()'는 객체 대신 결과 배열을 반환합니다. 그런 다음 배열을 나뭇 가지에 전달하고 반복 할 수 있습니다. 개체를 만들지 않으면 메모리에 문제가 없어야합니다. – MSadura

답변

1

전통적인 방법은 쿼리의 두 가지 변형을 사용하는 것입니다.

  1. 범위와 최대 결과를 포함하지만 페이징을 포함합니다.

  2. 아니요.

은 실제로, 첫 번째 쿼리는 두 번째하지만, 범위 필터를 추가 확장,하지만 당신은 수출을 요청할 때, 두 번째의 결과는 매우 큰 다운로드를 허용, 파일로 스트리밍됩니다. 또한 각 행을 개별적으로 선택하고 덤프 할 수 있습니다.

$query->iterate()을 사용하면 한 번에 하나씩 가져올 수 있지만이 메서드의 동작을 테스트하지는 않았으므로 설명서에 모든 메서드가 한꺼번에로드되지 않습니다.

http://www.doctrine-project.org/api/orm/2.4/source-class-Doctrine.ORM.Query.html#563-577

유용한 수출 형태는 PHPs에게 붙박이 기능을 사용하여 쓸 수 있습니다 whic CSV 것이다.

0

테이블에 모든 필드, 특히 최대 필드를 포함 할 필요가없는 경우 부분 쿼리를 사용하여 표시해야하는 필드 만 반환 할 수 있습니다. 나는 하나의 행에 정렬 된 5 개 또는 6 개의 짧은 텍스트 필드가있는 단일 페이지에서 20,000 개가 넘는 데이터 행을 반환하는 데이 방법을 사용했습니다.

$q = $em->createQuery("select partial u.{id,name} from MyApp\Domain\User u"); 

는 특정 코드하거나 아이디어를 원하는 경우하지 확인 doctrine2 docs here