2013-05-24 3 views
0
use lib '/var/www/Employees'; 

use DBConnect::DBConnect qw(getSchemaConnection); 

BEGIN { $ENV{DBIC_TRACE} = 1 } 

$schema = getSchemaConnection(); 

$salaries = $schema->resultset('Salary')->search(

{ 
    'employees.emp_no'=>100000 
}, 

{ 
    join =>'employees' 

} 

); 

print $emplyees->count; 

전 직원 테이블에 사원 번호와 급여를 검색 할 좋아하는 나는 두 테이블의 직원과 급여가 있고 급여는 직원 belongs_to입니다DBIx :: 클래스 :: ResultSource :: _ resolve_join() : 그런 관계

내가 여기

DBIx::Class::ResultSource::_resolve_join(): No such relationship employees on Salary at /var/www/Employees/Testing/3_simpleJoin.pl line 29 

내 calsses있는 다음과 같은 오류 얻을 그것을 실행하려고 :

급여 :

을 16,
package DAO::Schema::Result::Salary; 

# Created by DBIx::Class::Schema::Loader 
# DO NOT MODIFY THE FIRST PART OF THIS FILE 

use strict; 
use warnings; 

use base 'DBIx::Class::Core'; 

__PACKAGE__->add_columns(
    "emp_no", 
    { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, 
    "salary", 
    { data_type => "integer", is_nullable => 0 }, 
    "from_date", 
    { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 0 }, 
    "to_date", 
    { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 0 }, 
); 
__PACKAGE__->set_primary_key("emp_no", "from_date"); 

__PACKAGE__->belongs_to(
    "emp_no", 
    "DAO::Schema::Result::Employee", 
    { emp_no => "emp_no" }, 
    { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, 
); 


1; 

여기에 해당 오류에서 내 Employee 클래스

package DAO::Schema::Result::Employee; 

# Created by DBIx::Class::Schema::Loader 
# DO NOT MODIFY THE FIRST PART OF THIS FILE 

use strict; 
use warnings; 

use base 'DBIx::Class::Core'; 

__PACKAGE__->add_columns(
    "emp_no", 
    { data_type => "integer", is_nullable => 0 }, 
    "birth_date", 
    { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 0 }, 
    "first_name", 
    { data_type => "varchar", is_nullable => 0, size => 14 }, 
    "last_name", 
    { data_type => "varchar", is_nullable => 0, size => 16 }, 
    "gender", 
    { data_type => "enum", extra => { list => ["M", "F"] }, is_nullable => 0 }, 
    "hire_date", 
    { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 0 }, 
); 
__PACKAGE__->set_primary_key("emp_no"); 

__PACKAGE__->has_many(
    "salaries", 
    "DAO::Schema::Result::Salary", 
    { "foreign.emp_no" => "self.emp_no" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 

__PACKAGE__->has_many(
    "titles", 
    "DAO::Schema::Result::Title", 
    { "foreign.emp_no" => "self.emp_no" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 

1; 
+0

관련된 두 클래스의 ResultSources도 게시하십시오. –

답변

1

, 난 당신이 급여에 대한 결과 클래스 내부의 관계를 정의하지 않았다 같은데요. the manual for DBIC Relationships을보고 도움이되지 않는 경우 Result 클래스로 질문을 업데이트하십시오.

업데이트 : Salary에 정의 된 관계가 있습니다. join 행이 올바르지 않으면 join => 'emp_no'으로 변경하면 오류가 해결됩니다. 주 스크립트에서, 그리고

__PACKAGE__->belongs_to(
    "employee", # was "emp_no" 
    "DAO::Schema::Result::Employee", 
    "emp_no", # was a wrong condition 
    { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, 
); 

:

1

시도는 다음과 같이 Salarybelongs_to 관계를 정의하는

또한
my $salaries = $schema->resultset('Salary')->search({ 
    'employee.emp_no' => 100000, # was "employees" 
}, { 
    join => 'employee',   # was "employees" 
}); 

print $salaries->count; 

는, 자신에게 부탁을하고 항상 strict를 사용합니다.

+0

감사합니다. 하지만 사실은 내가 스키마 로더 make_schema_at ( 'DAO :: 스키마', 사용하여 데이터베이스 객체를 생성 {디버그 => 1, dump_directory =>, '.'}, [ "DBI : mysql을 : DBNAME = 직원" , "root", "root",] ); 하지만 그것은 내 모든 atabase 개체 belongs_to 관계 선박 emp_no 만든 테이블 별칭 이름, 어떻게 내가 그것을 deafult table_name 변경할 수 있습니다. – pavan

+0

'DBIx :: Class :: Schema :: Loader'가 릴레이션의 액세서 이름을 어떻게 생성하는지 모르겠습니다. 아마도 외래 키 제약 조건의 이름을 살펴볼 것입니다. 원래 SQL 스키마 정의를 게시 할 수 있습니까? 또한 생성 된'{emp_no => "emp_no"} "조건은 가짜로 보입니다. 아마도 최신 버전의'DBIx :: Class :: Schema :: Loader'를 사용하는 것이 도움이 될 것입니다. – nwellnhof

+0

이 표'salaries'를 CREATE ( 'emp_no'의 INT (11) NULL NOT, 'salary'의 INT (11) NULL NOT, 'from_date' 날짜 NOT NULL, 'to_date' 날짜 NULL NOT, PRIMARY KEY (' emp_no''from_date') KEY'emp_no' ('emp_no') FOREIGN KEY DELETE CASCADE ON ('emp_no') REFERENCES'employees' ('emp_no') ) ENGINE = 이노 DEFAULT 문자셋 salaries_ibfk_1' CONSTRAINT' = latin1 $$ – pavan

관련 문제