2013-05-24 4 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 :: Class :: 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:

Зарплата:

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

Пожалуйста, также опубликуйте источники результатов обоих участвующих классов. –

ответ

1

Из этой ошибки, я предполагаю, что вы не определили отношения внутри вашего класса Result зарплаты. Посмотрите на the manual for DBIC Relationships, и если это не поможет, обновите свой вопрос с помощью классов результатов.

Обновление: У вас есть отношения, определенные в Salary. Ваша строка join неверна, измените ее на join => 'emp_no', и это должно исправить ошибку.

1

Try определить belongs_to отношения Salary вроде этого:

__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" }, 
); 

Затем в главном скрипте:

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: имя_бд = сотрудники" , "корень", "корень",] ); но все мои объекты atabase, у которых есть отношение_отношения, созданное им emp_no, имеют имя псевдонима таблицы, как я могу изменить его на deafult table_name. – pavan

+0

Я не знаю, как «DBIx :: Class :: Schema :: Loader» генерирует имена аксессуаров для отношений. Вероятно, он смотрит на имена ограничений внешнего ключа. Можете ли вы опубликовать свои исходные определения схемы SQL? Кроме того, сгенерированное '{emp_no =>" emp_no "}' условие выглядит фиктивным. Возможно, это помогает использовать последнюю версию «DBIx :: Class :: Schema :: Loader». – nwellnhof

+0

CREATE TABLE 'salaries' ( ' emp_no' INT (11) NOT NULL, ' salary' INT (11) NOT NULL, ' from_date' дата NOT NULL, 'дата to_date' NOT NULL, PRIMARY KEY (' emp_no', 'from_date'), КЛЮЧ' emp_no' ('emp_no'), CONSTRAINT' salaries_ibfk_1' FOREIGN KEY ('emp_no') ЛИТЕРАТУРА' employees' ('emp_no') ON DELETE CASCADE ) ДВИГАТЕЛЬ = InnoDB УМОЛЧАНИЮ CHARSET = latin1 $$ – pavan

 Смежные вопросы

  • Нет связанных вопросов^_^