2013-05-15 2 views
0

PHP에서 SQL 쿼리를 생성하기 위해 moduleSelectQuery 클래스를 사용하고 있습니다.PHP에서 재귀 적 속성을 가진 객체

는 기본적으로,이 클래스는, 필드가 선택 같은 테이블 이름과 같은 SQL SELECT 쿼리의 개별 구성 요소를 나눕니다의 WHERE 조건 등 그러나이 빠르게 중첩 된 쿼리와 복잡하게

, WHERE table1.field1 IN (SELECT table2.field2 from table2 WHERE table2.field3 = criteria)

현재 절을 저장하는 데 사용되는 $inWhereClause이라는 속성이 있습니다. 다른 속성 (예 : $tableName, $whereClause, $havingClause)과 마찬가지로 사용자 입력을 기반으로 자체 함수에 의해 함께 구문 분석됩니다.

그러나이 파싱 기능은 근본적으로 제한되어 있습니다. $whereClause 속성을 구문 분석 할 때 충분한 노력을 기울일지라도 추가 중첩 SELECT 문을 사용할 수 없습니다.

나는 이것을 수행하는 한 방법이 을 또 다른 moduleSelectQuery 개체로 설정하는 것이라고 생각합니다. 이는 부모 moduleSelectQuery이 그 자체가 moduleSelectQuery 인 속성을 가짐을 의미합니다. 즉, 재귀 객체입니다. 이것이 PHP에서 가능한가/좋은 습관인가? 다른 결점이 있습니까?

+0

부모의 확장 된 하위 개체? 아마도 그것을 변경하여 부모 개체의 자식으로 select 문을 만들어서 "최종"문을 작성하는 objcet을 변경하여 자식을 여러 번 호출하여 기본 선택과 하위 선택을 만든 다음 병합합니다. 다시 기본 개체에. 아마도 쿼리 템플릿을 작성하기 위해 어떤 형식의 팩토리와 함께 사용할 수 있습니다. 나는 방금 ofc 아이디어를 내뿜고있다. – Dave

답변

0

나는 이것이 가능한 해결책임을 알 수있었습니다. Person 클래스를 시각화합니다. 어떤 사람에게는 아이가있을 수 있습니다. 부당하게 보이지 않는다.

개체가 자체를 참조하지 않고 개체가 동일한 클래스의 인스턴스 인 속성을 가질 수 있으므로이 개체를 반드시 재귀 개체라고 부르지는 않습니다.

Where 문에서 하위 쿼리 만 moduleSelectQuery 개체 여야하므로 간단한 비교가 문자열 또는 정수의 인스턴스가되어야하므로 분명히 적절하게 중첩되어야합니다.

이 접근법에서 도달 할 수있는 유일한 단점은 클래스 및 메서드 설계에 있습니다. 눈부신 성능 문제 또는 유지 관리 문제가 보이지 않습니다.

관련 문제