我有一张地点表:伦敦,东南,米德兰兹等。
我有一张'空缺类别'表:经理,技师等。
我有一个名为'location_id'列的空缺表和一个'vacancy_category_id'列。
所以我想搜索一下,例如,在Midlands的技术员工作或在东南部的经理工作。此查询的基本SQL非常明显。我的问题是如何在Catalyst中处理这个问题,因为它看起来不像使用Catalyst的“search_related”方法。减少了以下结果代码的代码片段。
Vacancy.pm:
__PACKAGE__->belongs_to( "location", "HABJ::Schema::Result::Location",
{id => "location_id"},{...});
__PACKAGE__->belongs_to( "vacancy_category", "HABJ::Schema::Result::VacancyCategory",
{id => "vacancy_category_id"},{...});
Location.pm:
__PACKAGE__->has_many( "vacancies", "HABJ::Schema::Result::Vacancy",
{"foreign.location_id" => "self.id"},{...});
VacancyCategory.pm:
__PACKAGE__->has_many( "vacancies", "HABJ::Schema::Result::Vacancy",
{ "foreign.vacancy_category_id" => "self.id" },{...});
在控制器中我可以搜索任何位置或类别的空缺表 使用search_related,但显然我需要能够搜索满足这两个条件的空缺:
my $jobsRS;
# either one of these works. How do you combine them?
if ($qJobsubtype) {
$jobsRS = $c->model("HABJ::VacancyCategory") ->
search ({ name=>$qJobsubtype}) ->
search_related('vacancies', {});
my $typeCount = $jobsRS -> count;
$c->log->debug("$typeCount vacancies of type [$qJobsubtype]");
}
if ($qCounty) {
$jobsRS = $c->model("HABJ::Location") ->
search ({ 'me.name'=>$qCounty}) ->
search_related('vacancies', {});
my $coCount = $jobsRS -> count;
$c->log->debug("$coCount vacancies in location [$qCounty]");
}
很明显,你不能期望从不同的表开始组合来自search_related查询的两个结果。所以我问是否有推荐的方法来做到这一点?
在回答dgw的查询时,我现在通过对Vacancy对象的结果集使用链式搜索来解决这个问题:
$jobsRS = $c->model("HABJ::Vacancy") ->vacs_for_location($qCounty, $c);
$jobsRS = $jobsRS -> vacs_for_job_subtype($qJobsubtype, $c);
哪种有效,但我不喜欢将上下文对象传递给模型。
谢谢! 还要感谢zpmorgan的整理,并对原版中过多的空白区域道歉。