2012-08-09 5 views
3

ORDER BY myfunction(col, ?, ?) DESC과 같이 주문을 생성하는 올바른 방법은 DBIx::Class의 바인드 값입니까?DBIx :: Class의 자리 표시 자로 정렬

현재 리터럴 SQL을 사용하고 있지만 몇 가지 이유로 최적이 아닙니다. 이 같은

$rs->search(undef, { order_by => \"myfunction(col, $v1, $v2) DESC" }); 

답변

2

내가 관리 못했다는 DBIx::Class 올바른 ORDER BY를 생성 할 수 있습니다. 다음은 코드입니다.

$rs->search(undef, { 
    order_by => \[ 
     'myfunction(mycol, ?, ?) DESC', map [dummy => $_], $v1, $v2 
    ] 
}); 
+0

BTW, [자리 표시 자 및 바인드 값 (하위 쿼리)이있는 리터럴 SQL] (http://search.cpan.org/~frew/SQL-Abstract-1.73/lib/SQL/Abstract.pm#Literal_SQL_with_placeholders_and_bind_values_%28subqueries)에 설명되어 있습니다. % 29) SQL :: 초록 –

4

뭔가 :

$rs->search(
    undef, 
    { 
     '+columns' => [{ 
      'res' => { 
       'func' => ['me.col', \['?' => $val1], \['?' => $val2]], 
       '-as' => 'res', 
      }, 
     }], 
     'order_by' => {'-desc' => 'res'}, 
    } 
); 

이 (MySQL의 & ($val1, $val2) = qw(val1 val2)에 대한) 생성합니다

SELECT `me`.`id`, ..., FUNC(`me`.`col`, ?, ?) AS `res` 
    FROM `table` `me` 
    ORDER BY `res` DESC: 
'val1', 
'val2' 
+0

괜찮습니다. +1. 이 객체는 행 객체에 추가 열을 채 웁니다 (즉,'$ row-> get_columns'의 결과에 'res'가 포함될 것입니다). 그러면 일부 코드가 손상 될 수 있습니다. –

+0

해결 방법으로이 열 (예 :'-res')을 표시하고 확장 된'DBIx :: Class :: Row :: inflate_result()'메소드에서 제거 할 수 있습니다. –

관련 문제