데이터를보고하기위한 인트라넷 사이트를 개발 중입니다. 저는 고객, 주문, 아이템, 청구서 등을위한 다양한 클래스를 개발했습니다.이 클래스들은 모두 서로 관련이 있습니다. 각 클래스 생성자는 MySQL 데이터베이스 (여러 쿼리)를 쿼리하고 이에 따라 속성을 채 웁니다.결과 집합 내의 개체 인스턴스화 ... 모범 사례?
현재 코드를 편리하고 일관성있게 유지하기 위해 필자는보고에서 클래스를 인스턴스화하는 데 많은 의존을하고 있습니다. 문제는 각 클래스 생성자가 다양한 소스에서 관련 속성을 가져 오거나 계산하여 여러 개의 MySQL 쿼리를 가질 수 있다는 것입니다. 이로 인해 루프 내의 모든 쿼리로 인해 성능이 저하됩니다. 그것은 사용할 수있어, 나는 한 번에 많은 톤의 사용자를 가지지 않을 것이다. 그러나 훨씬 빨라질 수있다.
예를 들어 고객의 최근 50 개 주문을 나열하고 있다고 가정 해 봅시다. 지금 내가하고있는 방식으로, 일반적으로 고객에게 50 개의 주문 ID만을 반환하는 간단한 쿼리를 작성합니다. 그런 다음 결과를 반복하면서 각 결과에 대해 새로운 순서를 인스턴스화합니다. 때로는 한 단계 더 깊숙히 들어가서 주문 내 각 항목에 대해 새 객체를 인스턴스화 할 수도 있습니다.
일부 의사 아이디어를주고 ....
$result = mysql_query("SELECT DISTINCT id FROM orders WHERE customer = 1234 LIMIT 50");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$order = new Order($row['id']); // more MySQL queries happen in constructor
// All of my properties are pre-calculated and formatted
// properly within the class, preventing me from having to redo it manually
// any time I perform queries on orders
echo $order->number;
echo $order->date;
echo $order->total;
foreach($order->items as $oitem) {
$item = new Item($oitem); // even more MySQL queries happen here
echo $item->number;
echo $item->description;
}
}
난 단지 요약 행에 개체 속성의 몇 가지를 사용할 수 있지만 내가 드릴 다운 할 때 더 자세히 주문을 볼
의 주문 클래스에는 준비가 필요한 모든 속성이 있습니다. 멋지고 깔끔합니다.
이것이 일반적으로 가장 잘 처리되는 방법은 무엇입니까? 요약 쿼리의 경우 클래스를 인스턴스화하지 않고 클래스와 별도의 쿼리 하나를 모두 가져와야합니까? 나는 내가 결과 집합 쿼리를 할 때마다 매번 클래스 내에서 일반적으로 많은 배경 작업을 수작업으로해야하기 때문에 걱정된다. 차라리 한 곳에서 변경하고 모든 페이지에서 반영된 클래스/속성을 쿼리하고 싶습니다.
이것을 적절하게 처리하는 다른 방법은 무엇입니까?
이것은 내가 찾고 있었던 것입니다! 필자가 제안한대로 수업을 재구성하기 시작했으며, 더 빠른 유연성으로 훨씬 빠른 결과를 포함하도록 개념을 사용할 수있었습니다. 여기서 제안한 것을 사용하여 항목을로드 할 것인지 여부와 같은 옵션을 전달할뿐만 아니라 기본 getOrders() 쿼리를 다양한 방식으로 필터링하는 추가 옵션을 전달합니다. 꽤 정확히 내가 무엇을 찾고 있었는지. 정말 고맙습니다! – user2702162
기꺼이 도와 드리겠습니다! – Divey