2011-12-09 8 views
0

이것은 내 첫 번째 질문입니다. 그러나 많은 도움을 얻을 수 있기를 바랍니다. 그래서 며칠 전에 직면 한 문제가 있습니다.사용자 정의 양식 필드 유형 및 사용자 정의 함수

프로젝트의 경우 사용자가 숫자 범위를 선택할 수있는 사용자 지정 양식 필드가 필요합니다.

예 : 내가 잘 내 사용자 지정 양식 필드 유형을 작성 관리했습니다

Number: greater-than 3 and lower-or-equal-than 5 

. 나는 Where 절을 추가하고 저장소 전체를 수정 한 저장소에 사용자 지정 메서드를 만들었습니다.

최근 내 프로젝트에 여러 다른 장소에 동일한 구성 요소가 필요했습니다. 이제 복제가 싫어서 DQL을 수정하는 논리가 중앙 위치에 있어야한다고 결정했습니다. Doctrine에서 제공하는 기능에 따르면, 이것은 UDF (사용자 정의 함수) 여야합니다.

나는 UDF를 구현하려고 시도했지만 아무 소용이 없었다.

Doctrine ORM 패키지의 Parser 및 Lexer 구성 요소를 배우고 사용할 수 있지만 필자는이 정도면 충분하지 않은 것 같습니다. 내가 잘 구문 분석을 해요,하지만 Doctrine2는 조건 연산자 후를 필요로

SELECT sometable.* FROM sometable sometable 
WHERE someProperty > 3 AND someProperty <= 5 

:

SELECT something FROM SomeBundle:Something something 
WHERE in_range(someProperty, gt, 3, lte, 5) 

그것은으로 변환 할 수 있습니다

깊이에 설명하기 위해, 여기에 결과 쿼리입니다 UDF이므로 구문은 다음과 같아야합니다.

SELECT sometable.* FROM sometable sometable 
WHERE in_range(someProperty, gt, 3, lte, 5) = 1 

이 구문을 사용하면 모든 매개 변수 (예 : gt 및 lte)에 대한 값을 지정합니다.이 매개 변수에는 이미 할당 된 매개 변수와 그렇지 않은 매개 변수를 추적하는 별도의 함수가 필요합니다. 또한이 솔루션은 작동하지 않는 것 같습니다. 파서가 내 함수 인수를 파싱하는 데 문제가있는 것 같습니다. D

필요한 것은 간단한 쿼리 수정 자입니다.

가능하면 더 나은 구문을 사용하고 싶습니다. 이 같은 것을 받아 들일 수 있습니다 :

someProperty is in_range(gt, 3, lte, 5) 

어떤 생각? 모든 참가자 들께 미리 감사드립니다!

P.S. Doctrine2 사이트에 따르면 UDF는 "공급 업체 특정 기능 구현"에 사용하기위한 것입니다. 아마도 나는 내 문제에 대한 올바른 해결책을 찾고 있지 않습니다. 어떤 제안?

답변

0

나는 내 자신의 Expr 클래스를 구현했다.

일부 장점은 다음과 같습니다

  • 특정 매개 변수를 사용하여 바인딩되지 않습니다, 그래서 당신은 당신이
  • 당신이 당신의 쿼리 당신이 필요로하는 방법을 정교하게 할 수 있습니다 무엇을해야 자신을 전달할 수 있습니다 그것 __toString 때문에() 메서드를 사용하는 쿼리를 반환하는 메서드

Doctrine2는 현재 사용자 정의 Expr 클래스를 지원하지 않기 때문에 광산을 사용하려면 __toString() 메서드를 사용하고 결과가 비어 있지 않은 상태에서 전달됩니다. o 쿼리 빌더의 andx()/orx() 메소드.

0

BETWEEN (http://www.doctrine-project.org/docs/orm/2.1/en/reference/dql-doctrine-query-language.html#dql-select-examples)을 사용하지 않는 이유는 무엇입니까?)?

+0

사용자는 비교 조건을 지정할 수 있어야하고,()보다 크거나 같음 및 낮음 또는 같음을 강제합니다. 다른 어떤 방법으로 성공하지 못하면 이것은 나의 후퇴 일 것이다. –

관련 문제