【问题标题】:DBIx::Class::ResultSource::_resolve_join(): No such relationshipDBIx::Class::ResultSource::_resolve_join():没有这种关系
【发布时间】:2013-05-24 20:25:52
【问题描述】:
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;

我有两张表employees和salary,Salary is belongs_to employees 我喜欢用employees表中的员工编号搜索薪水

当我尝试运行它时,我收到以下错误

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

这是我的课程:

薪水:

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;

【问题讨论】:

  • 请同时发布两个相关课程的 ResultSources。

标签: perl dbix-class


【解决方案1】:

尝试像这样定义Salarybelongs_to关系:

__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

【讨论】:

  • 谢谢我知道了。但实际上我使用模式加载器 make_schema_at('DAO::Schema', { debug => 1, dump_directory => '.', }, [ "dbi:mysql:dbname=employees","root", “根”, ] );但是它创建的所有具有belongs_to关系的数据库对象emp_no都有表别名,我怎样才能将其更改为默认表名。
  • 我不知道DBIx::Class::Schema::Loader 是如何为关系生成访问器名称的。它可能会查看外键约束的名称。你能发布你原来的 SQL 模式定义吗?此外,生成的{ emp_no => "emp_no" } 条件看起来很假。也许使用最新版本的DBIx::Class::Schema::Loader会有所帮助。
  • 创建表salaries (emp_no int(11) NOT NULL, salary int(11) NOT NULL, from_date date NOT NULL, to_date date NOT NULL, 主键(emp_no,from_date), 键 emp_no (emp_no), 约束 salaries_ibfk_1 外键 (emp_no) 引用 employees (emp_no) ON DELETE DELETE CASCULT )拉丁1$$
【解决方案2】:

从那个错误中,我猜你没有在你的 Result 类中为 Salary 定义关系。查看the manual for DBIC Relationships,如果没有帮助,请使用 Result 类更新您的问题。

更新:您已经在Salary 中定义了关系。您的 join 行不正确,将其更改为 join => 'emp_no' 应该可以解决错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2011-10-29
    • 2011-07-09
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多