【问题标题】:Perl Catalyst: Resultset and RelationsPerl Catalyst:结果集和关系
【发布时间】:2013-04-22 05:48:29
【问题描述】:

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

【问题讨论】:

  • 我不知道如何在我的视图文件中输出结果。 — 这是由$c->stash->{search_results} = ... 完成的。然后你如何处理它取决于你使用的视图。
  • 这是在两个表之间建立关系的正确方法吗? — 通常你会在数据库模式中定义关系。但是,有时您仍然希望在调用查询时明确说明联接。
  • 我的 SQL 看起来像 — 您可以通过在运行 yourapp_server.pl 之前设置环境变量 DBIC_TRACE=1 来查看 SQL 的实际样子
  • 感谢任何帮助和提示 — 您可能想在命令行脚本中 use 您的数据库架构,以便您可以使用(并掌握) DBIC 没有包裹 Catalyst。
  • @Quentin 没有输出 SQL,所以我猜它没有执行任何东西?

标签: perl catalyst


【解决方案1】:

连接对我来说看起来不错,但尝试一个没有连接的简化版本来检查其他一切是否正常。

DBIx::Class::ResultSet::search 的行为因调用它的上下文而异。如果在列表上下文中调用它,那么它将执行数据库查询并返回一个 MyApp::DBIC::Schema::Account 对象数组。例如:

my @accounts = $c->model('DB::Account')->search();

在您的情况下,您在标量上下文中调用 search,这意味着它不会返回一个数组,而是返回一个 DBIx::Class::ResultSet 对象(或其子类),而且至关重要的是它实际上不会执行一个 db询问。为此,您需要在结果集上调用 all 方法。因此,假设您使用的是默认模板工具包视图,您可能想要这样的东西:

[% FOREACH search_result IN search_results.all %]
    [% search_result.first_name %]
[% END %]

DBIx::Class 的这种“懒惰”行为实际上非常有用,在我看来,在文档中有些低估了。这意味着您可以将结果集保存在变量中并继续对其执行不同的搜索调用,而无需实际访问数据库,在您希望有条件地构建复杂查询的情况下,它可以允许更好的代码。有关详细信息,请参阅DBIx::Class::Resultset 文档。

【讨论】:

    【解决方案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,
      }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2010-10-29
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多