2013-04-22 1 views
0

데이터베이스에 두 개의 테이블이 있고 테이블 중 하나가 내 계정 테이블과 연결되어 있습니다.펄 (Perl) 카탈리스트 : 결과 집합과 관계

그래서 Account.pm에 대한 내 스키마 결과에서 다음 줄을 추가했습니다.

__PACKAGE__->has_many('subjects', 'MyApp::DBIC::Schema::Subject', {'foreight.account_id' => 'self.account_id'}); 

그런 다음 내 컨트롤러에서 나는 이와 같은 검색을합니다.

$c->stash->{search_results} = $c->model('DB::Account')->search(
{ -or => [ 
    firstname => {like => '%'.$search_term.'%'}, 
    'subjects.subject_title' => {like => '%'.$search_term.'%'}, 
] 
}, 
{ 
join => 'subjects', 
rows => '3', 
}, 
{ 
order_by => 'first name ASC', 
page => 1, 
rows => 10, 
} 
); 

오류를 출력하지 않지만 내보기 파일에 결과를 출력하는 방법을 알 수 없습니다. 이것은 두 테이블 사이의 관계를 만드는 올바른 방법입니까?

내 목표 : search_term을 제공하고 두 개의 테이블을 검색하여 결과를 뷰 파일에 출력하십시오. 내 SQL은 다음과 같습니다.

SELECT FROM Accounts,Subjects WHERE Accounts.firstname=$search_term OR Subjects.subject_title=$search_term LEFT JOIN Subjects ON Accounts.account_id=Subject.account_id 

위의 설명과 같이 결과를 뷰 파일에 출력하려고합니다.

나는 Perl에 상당히 익숙하며 일부 문서는 그렇게 나에게 의미가 없다. 그래서 어떤 도움이나 조언을 부탁드립니다.

+0

* 내가 * 어떻게 출력 내보기 파일에 결과를에 알아낼 수 없습니다 - 그건에 의해 이루어집니다'$ C -> 숨김 -> {검색 결과} = ...'. 그런 다음 어떻게 처리 할 것인가는 사용하는보기에 달려 있습니다. – Quentin

+0

* 두 테이블 간의 관계를 만드는 올바른 방법입니까? * - 일반적으로 데이터베이스 스키마에서 관계를 정의합니다. 때로는 쿼리를 호출 할 때 여전히 조인에 대해 명시해야 할 수 있습니다. – Quentin

+0

* My SQL은 다음과 유사합니다 * - yourapp_server를 실행하기 전에 환경 변수'DBIC_TRACE = 1'을 설정하여 SQL이 실제로 어떻게 보이는지 확인할 수 있습니다.pl' – Quentin

답변

1

당신은 쿼리에 오류가 있습니다

보십시오.

$c->stash->{search_results} = $c->model('DB::Account')->search(
    { -or => [ 
     firstname => {like => '%'.$search_term.'%'}, 
     'subjects.subject_title' => {like => '%'.$search_term.'%'}, 
    ] 
    }, 
    { 
    join => 'subjects', 
    order_by => 'firstname ASC', 
    page => 1, 
    rows => 10, 
    } 
); 
+0

완벽하게 작동했습니다. 감사 맥스! – Grigor

2

내게는 괜찮은 것 같지만, 조인하지 않고 단순화 된 버전을 사용해 다른 모든 항목이 정상인지 확인하는 것이 좋습니다.

DBIx::Class::ResultSet::search의 동작은 호출 된 컨텍스트에 따라 다릅니다. 목록 컨텍스트에서 호출 된 경우 데이터베이스 쿼리를 실행하고 MyApp::DBIC::Schema::Account 개의 배열을 반환합니다. 예를 들면 :

아니라 배열을 반환하는 것보다이 DBIx::Class::ResultSet 객체 (또는 그 서브 클래스)을 반환하며, 결정적으로 실제로하지 않습니다 것을 의미합니다 당신은 스칼라 문맥에서 search를 호출하고 귀하의 경우에,
my @accounts = $c->model('DB::Account')->search(); 

db 쿼리를 실행하십시오. 그런 일이 발생하려면 결과 집합에서 all 메서드를 호출해야합니다.

[% FOREACH search_result IN search_results.all %] 
    [% search_result.first_name %] 
[% END %] 

DBIx이 '게으른 행동 :: 클래스는 문서에 다소 미달 실제로 매우 유용하고, 내 의견 : 그래서, 당신은 기본 템플릿 툴킷을 사용하는 가정 당신은 아마 이런 식으로 뭔가를 원하는보기 . 결과 집합을 변수에 보관하고 실제로 DB를 사용하지 않고도 다른 검색 호출을 계속 실행하면 복잡한 쿼리를 조건부로 구축하려는 경우 훨씬 좋은 코드를 허용 할 수 있습니다. 자세한 내용은 DBIx::Class::Resultset 설명서를 참조하십시오.