2013-03-01 4 views
1

AJAX (PHP 백엔드)를 통해 데이터베이스에 쿼리를 보내고 싶습니다. 회사, 사용자, 송장, Invoice_Lines 4 테이블 있습니다. 나는 그것의 구성 요소 (열, 테이블 및 조건)에 제출 된 SQL 쿼리를 깨뜨릴 PHP에서 간단한 파서를 작성했습니다SQL SELECT에 조건을 삽입하는 방법은 무엇입니까?

Users.Company_ID -> Companies.ID 
Invoices.Company_ID -> Companies.ID 
Invoice_Lines.Invoice_ID -> Invoices.ID 

다음과 같이 중요한 관계이다.

사용자가 쿼리를 직접 작성할 수는 있지만 SQL Server에 제출하기 전에 수정하여 모든 정보가 로그인 한 사용자의 회사 ID로 제한되도록하고 싶습니다. 예를 들면 : 나는 쿼리를 원하는

SELECT Users.ID, Users.Name, Users.Email 
FROM Users 

가되기 위해 : 더 복잡한 예에서

SELECT Users.ID, Users.Name, Users.Email 
FROM Users 
WHERE Users.Company_ID = X 

:

SELECT Invoice_Lines.Subtotal 
FROM Invoice_Lines 
WHERE Invoice_Lines.Invoice_ID = 4 

가되다

SELECT Invoice_Lines.Subtotal 
FROM Invoice_Lines 
INNER JOIN Invoices ON (Invoice_Lines.Invoice_ID = Invoice.ID) 
INNER JOIN Company ON (Invoice.Company_ID = Company.ID) 
WHERE Invoice_Lines.Invoice_ID = 4 AND Company.ID = X 

그것은 분명 보인다 나는 테이블 별칭을 만들어야 할 것이다. 이미 작성된 진술과 충돌하지 마십시오. 가장 효율적인 방법이 입력을 제한하는 것을 결정하기 위해 쿼리를 분석하는 방법에 대해서는 확신 할 수 없습니다.

SQL의 하위 집합 (별칭이있는 직접 테이블 열, 테이블과 별칭이있는 왼쪽 조인과 내부 조인 및 간단한 식)을 지원할 예정입니다.

+1

여기에 고무 덕킹이 대부분입니까? 내가 진짜 질문을하는지 확신하지 못한다. 비슷한 프로젝트를 여러 번 해본 적이 있는데 "SQL"을위한 OOP 인터페이스를 갖는 것이 유용 할 수 있다는 것을 알게되었습니다. ['Zend_Db_Select'] (http://framework.zend.com/manual/1.12/ko/zend.db.select.html)가 떠오른다. 주요 이점은 'from'및 'joins'까지 전체 SQL 문을 작성한 다음 쿼리에 사용 된 실제 열을 기반으로 필요한 항목에만 조인하는 것입니다. – ficuscr

+0

입력 및 출력을 알고 있지만 분석 부분에 문제가 있습니다. 나는 모든 쿼리를 위해 그것을 손으로 할 수 있지만, 나를 위해 그것을 변환 할 일반적인 알고리즘을 상상할 수 없다. 아마도 INNER JOINs 톤을 추가하게 될 것입니다. – Martin

답변

0

젠드 프레임 워크가 Zend_Db_Select으로 OP 방식으로 SQL 문을 설명하는 방법을 다시 한번 제안합니다.

1) 열을 선택할 모든 테이블을 포함하는 기본 SQL 문을 정의하십시오. - 물론 개체에 대한 스왑 할 수 사용하여 배열

SELECT * 
FROM table1 
LEFT JOIN table2 on table2.table1Id = table1.id 
LEFT JOIN table3 on table3.table2Id = table2.id 
LEFT JOIN table4 on table4.table3Id = table3.id 

2) 당신은) 사용자가 열을 선택하기 위해 (결국 내가 너무 제약을 상상할 수 :

말할 수 있습니다.

$fields = array(
    'table1' => array(array('col1'/*actual field name*/ => 'col1_Alias' /*assigned alais*/), array('col2'=>'col2_Alias') 
    'table2' => array(array('col1'=>'col1_Alias'), array('col2'=>'col2_Alias') 
    etc... 
); 

는 컨트롤러에 그 정의가 쿼리를 구축 할 때 사용자를주는 옵션을 사용합니다. 그들은 SQL을 구축하기 위해 자신의 선택을 제출할 때 다음 각 테이블 참조 추적하고 아마도이 필요한 경우를 결정할 수있는 루프에서 ...

의사 틱 코드 ...

foreach ($selectColumns as $table => $col) { 
    $cols[] = "{$table}.{$col['field']} AS {$col['alias']}"; 
} 

를 사용 SQL 문에서 실행합니다. Zend_Db_Select와 같은 OOP 기능을 다시 입력하기 위해 JOINS의 성격을 올바르게 설명해야합니다.

내 대답에는 고기가별로 없지만 도움이 되길 바랍니다.

관련 문제