2010-08-07 2 views
2

문제 정의.DBIx :: Class :: ResultSet에서이 검색 및 order_by를 수행하는 방법

여러 명의 사용자가있는 클라이언트가 여러 개 있습니다. 각 클라이언트는 맞춤 검색 데이터를 사용자, 검색 및 주문과 연결할 수 있어야합니다.


데이터베이스 솔루션 :

테이블 Customfields customfields 테이블을 정의합니다. ID와 이름이 있습니다. Userfields 테이블 (일명 "특성")과 has_many 관계가 있습니다.

Userfields 테이블에는 userid, customfieldid, content 및 id가 있습니다.

이것은 달성하고 무엇을 생산하는 select 문입니다 : 그것은


내가 원하는 선택 문을 제안한 Useraccounts 테이블 (일명 "useraccount")와 Customfields (일명 "customfield")를 belongs_to 나는 필요하다.

SELECT ua.*, (
    SELECT content FROM Userfields uf 
    INNER JOIN Customfields cf 
     ON cf.id = uf.customfieldid 
    WHERE cf.name = 'Mothers birthdate' 
    AND uf.uid=ua.uid 
) AS 'Mothers birthdate', 
    (
    SELECT content FROM Userfields uf 
    INNER JOIN Customfields cf 
     ON cf.id = uf.customfieldid 
    WHERE cf.name = 'Join Date' AND 
    uf.uid=ua.uid 
) AS 'Join Date' 
FROM UserAccounts ua 
ORDER BY 'Mothers birthdate'; 

이 경우 0에서 아무것도 ... X 서브를 선택합니다 select 문에서 문 그들 중 어느 하나 그들 중 누구도으로 주문하고자 할 수 없었다 자신이 될 수 있습니다.


질문

하는 방법은이를 달성 할 -> 내 dbix 수준의 결과 집합 또는 어떻게 내 dbix 수준의 결과 집합에 대한 검색과 같은 결과를 얻을 않습니다에 대한 검색?

여기서부터 내가 원하는 복잡한 명령문을 수행하는 방법을 잘 모르겠지만, 보통 내 Useraccounts 테이블에서 선택하는 방법입니다.

my @users = $db->resultset('Useraccounts')->search(
    undef, 
    { 
     page  => $page, 
     join  => 'attributes', 
     ... 
    }); 

감사합니다.

+0

나는 이것에 대답하려고 너무 피곤하지만, 사람, 나는 당신에게 잘 쓰여진 그런 질문을 집어 넣을 소품을 줄 필요가있다! –

+0

건배 JGB; 잘하면 그것은 좋은 대답을 격려합니다. :) –

답변

2

-pdh

이 정말 꽤 털이이며, 모든 솔루션은 꽤 될 수 없습니다, 그러나 당신이 규칙을 조금 구부리 경우보기가 가능하도록한다. 내가 테스트하지 않은 스키마를 만들어 테스트 해본 결과 실수를 용서할 수 있었지만, 내가 가지고있는 최고의 정보를 기반으로했습니다 (그리고 ribasushi의 많은 도움). 그것은이다 -

는 첫째,

my $mbd = $userfields_rs->search(
    { 
     'customfield.name' => 'Mothers birthdate', 
     'uf.uid' => \'me.uid' # reference to outer query 
    }, 
    { 
     join => 'customfield', 
     alias => 'uf', # don't shadow the 'me' alias here. 
    } 
)->get_column('content')->as_query; 

# Subqueries and -as don't currently mix, so hack the SQL ourselves 
$mbd->[0] .= q{ AS 'Mothers Birthdate'}; 

에 대해 일치되고 uf.uid 문자 적 ​​me.uid은 언 바운드 변수 (당신의 userfields 테이블이 customfields 테이블과 belongs_to 관계를 가지고 있다고 가정 customfield라고도 함) uid 필드를 쿼리에서 가져와 결국이 쿼리를 subselect로 넣습니다. 기본적으로 DBIC는 쿼리가 주소 지정하는 테이블의 별칭을 me으로 지정합니다. 만약 당신이 다른 별칭을 주었다면 당신은 여기서 다른 것을 사용할 것입니다. 어쨌든, 필드 이름을 변경하는 것만으로도 똑같은 많은 필드를 사용하여이 as_query 비즈니스를 반복 할 수 있습니다 (똑똑한 사람이라면 생성 방법을 작성하여 배열에 넣을 수 있습니다). 이제는 @field_queries이 배열이고 위의 $mbd과 Join Date를 기반으로 한 다른 배열을 포함한다고 가정합시다. 당신이이 있으면

, 그것은 ... 한 "간단한"의 선택에 하위 쿼리의 각이 포함됩니다

my $users = $useraccounts_rs->search(
    { }, # any search criteria can go in here, 
    { 
     '+select' => [ @field_queries ], 
     '+as' => [qw/mothers_birthdate join_date/], # this is not SQL AS 
     order_by => {asc => 'Mothers birthdate'}, 
    } 
); 

.

이제 슬픈 부분에 대해 : 지금 당장이 자리 표시 자의 하위 쿼리가 제대로 작동하지 않기 때문에이 모든 내용이 실제로 이되지 않습니다. 그래서 지금은 추가적인 해결 방법이 필요합니다 : subselect 검색에 'customfield.name' => 'Mothers birthdate' 대신 'customfield.name' => \q{'Mothers birthdate'}을 입력하십시오. 이것은 자리 표시 자 버그를 회피하는 필드 이름 (BE CAREFUL SQL 주입의 리터럴 SQL!)을 사용하고 있습니다. 하지만 멀지 않은 미래에 버그가 해결 될 것이며 위의 코드는 정상적으로 작동 할 것이며, 우리는 그 사실을 알려주기 위해 답을 업데이트 할 것입니다.

+0

고마워요 Hobbs (그리고 Ribasushi) :). 시간의 짧은 공간에서 내가 기대했던 것보다 더 많은 도움이되었습니다. D. 당신에게 많은 명성 :) –

+0

이 2 점. 1) -> get_column ('content') -> as_query; 배열의 예상 참조가 아닌 배열 참조에 대한 참조를 반환합니다. 이것은 현재의 dbix :: class의 버그 일지 모르지만 changelog에 언급 된 수정 사항을 볼 수 없으며 문서가이를 나타낼 것 같습니다. 예상되는 행동! $ {$ userfields_rs-> search (...)} 2) 내 검색에 'bind'=> $ mbd -> [1] 을 추가하여 자리 표시 자 문제를 해결했습니다. 오늘 아침에 놀고 난 후 모두 작동합니다. –

+0

약간의 문제가 있습니다. 결과 집합에서 페이징을하면 결과가 나오지 않습니다.> total_entries가 나오지 않아 필요없는 자리 표시자가있는 것처럼 보입니다. 그것들을 끝에 추가하면 오류가 발생합니다. 지금은 평가를 통해 그 문제를 해결하고 있지만 추한 것입니다. –

관련 문제