我的数据库中有两个表,其中一个表与我的Accounts表关联。
因此,在我的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 :(得分:3)
加入对我来说看起来不错,但尝试一个没有联接的简化版本来检查其他一切是否正常是有意义的。
DBIx::Class::ResultSet::search
的行为根据调用它的上下文而有所不同。如果在列表上下文中调用它,则它执行数据库查询并返回MyApp::DBIC::Schema::Account
个对象的数组。例如:
my @accounts = $c->model('DB::Account')->search();
在你的情况下,你在标量上下文中调用search
,这意味着它不会返回一个数组,而是返回一个DBIx::Class::ResultSet
对象(或其子类),而且至关重要的是它不会实际上执行数据库查询。要实现这一点,您需要在结果集上调用all
方法。因此,假设您使用的是默认模板工具包视图,您可能需要这样的内容:
[% FOREACH search_result IN search_results.all %]
[% search_result.first_name %]
[% END %]
DBIx :: Class的这种“懒惰”行为实际上非常有用,在我看来文档中有些不足。这意味着您可以将结果集保存在变量中并继续对其执行不同的搜索调用而不实际访问数据库,它可以在您希望有条件地构建复杂查询的情况下允许更好的代码。有关详细信息,请参阅DBIx::Class::Resultset文档。
答案 1 :(得分:2)
您的查询中有错误:
尝试:
$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,
}
);