1

我的数据库中有两个表,其中一个表与我的 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 还很陌生,有些文档对我来说仍然没有多大意义。因此,我们将不胜感激任何帮助和提示。

4

2 回答 2

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文档。

于 2013-04-22T08:33:45.830 回答
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,
  }
);
于 2013-04-24T07:29:07.203 回答