2015-01-27 3 views
1

아래의 간단한 Propel 쿼리는 국가 코드 (알파벳 순서)에 따라 필터링됩니다. 그러나 상단에 특정 countrycode보기를 만들기 위해 필터를 수행 할 수 있어야합니다. 이것은 아마도 단일 Propel 쿼리를 사용합니까? (현재)단일 쿼리를 사용하여 결과를 가져오고 순서를 변경합니다.

내 쿼리 : 내 결과가 countrycode 만 당 하나 개의 결과 (중복 불가능)을 가지고

$query = CountryQuery::create() 
    ->filterByCountrycode($countryCode) 
    ->find(); 

는 이제 단지 하나의 항목을 찾을 것입니다. 그러나 다음 단계에서는 다른 쿼리를 수행하여 모든 결과를 찾아서 병합 할 것이라고 생각했지만 두 쿼리를 수행하면 생산성이 떨어지는 것으로 보입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

예 :

국가 코드가 출력됩니다 영국 위의 쿼리는 다음 GB 경우

. 그러나 원하는 결과는 알파벳순으로 국가 목록을 제공하지만 첫 번째 항목은 영국입니다.

+1

난 당신이 행의 낮은 숫자 (100 정도 상대하고 (추측에서) 이후 사용자 정의 귀하의'CountryQuery' 객체의'findWithSpecialOrdering()'기능으로 이런 짓을 했을까 다음은 쿼리입니다). 커스텀 파인더에서'find()'를 호출 한 다음 결과로 나온'PropelCollection'을 특별한 경우에 대해 검색하면됩니다. 찾은 경우 배열에서 제거하고 처음에 팝하십시오. 이것은 모두 메모리에서 이루어 지므로 상당히 빨라야합니다. – halfer

+2

또는이 테이블에'special_order' 컬럼을 추가 할 수 있습니다. 특별한 경우는'0'이고, 그렇지 않은 경우'1'입니다. 이 필드를 주문한 다음 국가 이름을 부차적으로 주문할 수 있습니다. – halfer

+0

@halfer 예. 조용합니다. 나는 그것이 모델에 의해 출력되기 전에 배열을 수정하는 것과 관련하여 상자 밖에서 충분히 생각하지는 않는다. 모범 사례로 간주되는 것은 무엇입니까? 가상 열을 추가하거나 결과 배열을 수정 하시겠습니까? –

답변

2

@halfer가 제안 했으므로 가상 열을 추가하고 순서를 지정할 수 있습니다.

$countryCode = 'ru'; 
$countries = \CountryQuery::create() 
    ->addAsColumn('order_field', "CASE WHEN code = '$countryCode' THEN 1 ELSE 0 END") 
    ->select(array('Id', 'Name', 'Code')) 
    ->orderBy('order_field', \Criteria::DESC) 
    ->orderById(\Criteria::ASC) 
    ->find(); 
+0

나는 이것을 시도 할 것이다. 귀하의 의견을 주셔서 감사합니다 나는이 방법에 관해서 한 번 봐보고 다시 할 것입니다. 그러나 주사의 가능성을 피하기 위해 진술서를 준비하는 방법이 있습니까? 아니면 이것을 처리 할 것인가? –

+1

아, 이건 내 아이디어보다 낫네. 나는 어레이 조각을 추천했다. 이 작업은 데이터베이스 레이어에서 작업을 수행하는데 이는 약간 빠릅니다. Liam이 맞습니다.'$ countryCode'는 사용자 입력에서 오는 SQL 인젝션에 취약합니다 - 저는 country 테이블에서 초기 검색을 실행하고 거기에 없으면'addAsColumn 조항. – halfer

관련 문제