Perl Catalyst:结果集和关系
我的数据库中有两个表,其中一个表与我的Accounts表关联 因此,在Account.pm的模式结果中,我添加了以下行Perl Catalyst:结果集和关系,perl,catalyst,Perl,Catalyst,我的数据库中有两个表,其中一个表与我的Accounts表关联 因此,在Account.pm的模式结果中,我添加了以下行 __PACKAGE__->has_many('subjects', 'MyApp::DBIC::Schema::Subject', {'foreight.account_id' => 'self.account_id'}); 然后在我的控制器中进行如下搜索 $c->stash->{search_results} = $c->model('DB::
__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,
}
);
它不会输出任何错误,但我不知道如何在视图文件中输出结果。这是在两个表之间建立关系的正确方法吗
我的目标:提供一个搜索\u术语
,搜索两个表并将结果输出到视图文件中。我的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相当陌生,有些文档对我来说仍然没有多大意义。因此,任何帮助和提示都将不胜感激。我认为连接正常,但尝试一个没有连接的简化版本来检查其他一切是否正常是有意义的
DBIx::Class::ResultSet::search的行为因调用它的上下文而异。如果在列表上下文中调用它,那么它将执行数据库查询并返回MyApp::DBIC::Schema::Account
对象数组。例如:
my @accounts = $c->model('DB::Account')->search();
在您的例子中,您在标量上下文中调用search
,这意味着它将返回一个DBIx::Class::ResultSet
对象(或其子类),而不是返回一个数组,关键是它实际上不会执行db查询。为此,您需要在结果集上调用all
方法。因此,假设您使用的是默认的template toolkit视图,那么您可能需要如下内容:
[% FOREACH search_result IN search_results.all %]
[% search_result.first_name %]
[% END %]
DBIx::Class的这种“懒惰”行为实际上非常有用,在我看来,在文档中有点言过其实。这意味着您可以在变量中保留resultset,并对其执行不同的搜索调用,而无需实际访问数据库。在需要有条件地构建复杂查询的情况下,它可以提供更好的代码。有关更多详细信息,请参阅文档。我认为连接正常,但尝试一个没有连接的简化版本来检查其他一切是否正常是有意义的
DBIx::Class::ResultSet::search的行为因调用它的上下文而异。如果在列表上下文中调用它,那么它将执行数据库查询并返回MyApp::DBIC::Schema::Account
对象数组。例如:
my @accounts = $c->model('DB::Account')->search();
在您的例子中,您在标量上下文中调用search
,这意味着它将返回一个DBIx::Class::ResultSet
对象(或其子类),而不是返回一个数组,关键是它实际上不会执行db查询。为此,您需要在结果集上调用all
方法。因此,假设您使用的是默认的template toolkit视图,那么您可能需要如下内容:
[% FOREACH search_result IN search_results.all %]
[% search_result.first_name %]
[% END %]
DBIx::Class的这种“懒惰”行为实际上非常有用,在我看来,在文档中有点言过其实。这意味着您可以在变量中保留resultset,并对其执行不同的搜索调用,而无需实际访问数据库。在需要有条件地构建复杂查询的情况下,它可以提供更好的代码。有关更多详细信息,请参阅文档。您的查询中有错误:
尝试:
您的查询中有错误:
尝试:
我不知道如何在我的视图文件中输出结果。-这是由$c->stash->{search\u results}=.
完成的。然后如何处理它取决于您使用的视图。这是在两个表之间建立关系的正确方法吗通常在数据库模式中定义关系。有时,在调用查询时,您仍然希望明确说明连接。My SQL的外观类似于-您可以通过在运行yourapp\u server.pl
之前设置环境变量DBIC\u TRACE=1
来查看SQL的实际外观-您可能希望在命令行脚本中使用
您的数据库架构,这样您就可以在不使用Catalyst的情况下使用(并掌握)DBIC。@Quentin不输出SQL,所以我猜它没有执行任何SQL?我不知道如何在我的视图文件中输出结果。-这是由$c->stash->{search\u results}=.
完成的。然后如何处理它取决于您使用的视图。这是在两个表之间建立关系的正确方法吗通常在数据库模式中定义关系。有时,在调用查询时,您仍然希望明确说明连接。My SQL的外观类似于-您可以通过在运行yourapp\u server.pl
之前设置环境变量DBIC\u TRACE=1
来查看SQL的实际外观-您可能希望在命令行脚本中使用
您的数据库架构,这样您就可以在不使用Catalyst的情况下使用(并掌握)DBIC。@Quentin不会输出SQL,所以我猜它不会执行任何SQL?