[PerlChina] 关于DBIx::Class::ResultClass::HashRefInflator一点问题

Fayland Lam fayland at gmail.com
Tue Mar 18 04:17:24 PDT 2008


cui robin wrote:
> 2008/3/18 cui robin <cuiyuming at gmail.com <mailto:cuiyuming at gmail.com>>:
>
>     HI,
>     我是昨天问过DBIC数据向JSON转换的家伙,在fayland的提示下,开始使用
>     DBIC中包含的的HashRefInflator模块,将结果先转换成hash,然后再用
>     Catalyst::View::JSON转成JSON。
>     可是我发现个问题,如果我用resultset的find方法,如下:DataDumper可
>     以看出得到一个正确的Hash结果,但是如果使用 search得到的结果,其中
>     的内容还是object的,很多冗余信息。
>     大家有遇到这个问题么?
>
>     #! /usr/bin/perl
>     use lib './';
>     use CBSDB;
>     use Data::Dumper;
>     use DBIx::Class::ResultClass::HashRefInflator;
>
>     my $dsn='dbi:mysql:dbStatus;192.168.182.5';
>     my $user='dbstatus';
>     my $pass='dbstatus';
>     my $schema = CBSDB->connect($dsn,$user,$pass);
>     $schema->storage->debug(1);
>
>     my $rs_base_mach = $schema->resultset('Base_mach');
>     $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');
>     #$base_mach = [$rs_base_mach->search({'me.app' =>
>     'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];
>     $base_mach=$rs_base_mach->find('172.24.68.93 <http://172.24.68.93>');
>     print Data::Dumper->Dumper($base_mach);
>
>     robincui
>
>
> 我尝试昨天fayland说的另外一个方法是可以的,如下:
> my $rs_base_mach = $schema->resultset('Base_mach');
> $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');
> @base_mach = $rs_base_mach->search({'me.app' =>
> 'Penguin'},{join=>'mach_group',prefetch=>'mach_group'});
> for (@base_mach) {
> $_ = $_->{_column_data};
> }
> print Data::Dumper->Dumper(\@base_mach);
>
> 不明白为什么昨天fayland邮件里说如果有relationship的话会有什么问题么?
>
> 比如 @a = $c->model('X')->all; foreach (@a) { $_ = $_->{_column_data} }
> 这样。这样的情况是没有 relationship.
> 有的话,还是去查询 DBIx::Class 的 doc 好了。有个 HashRef 的 模块。

我的意思是,比如你的
#$base_mach = [$rs_base_mach->search({'me.app' =>
'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];
这里有个 join prefetch
然后用 $_ = $_->{_column_data}, 这个 join prefetch 就没了。
将 DBIC object 转为 hash 一般是用 HashRefInflator
如果行不通的话,就手工转呗。

大不了这么写
my $whatIwant = {
a => $base_mach->a,
b => $base_mach->b,
c => $base_mach->c->real,

之类的。


>
> 还有google别人maillist提过相同的问题在:
> http://lists.scsys.co.uk/pipermail/dbix-class/2008-February/005733.html
> DBIC那位作者,也回复了,但我每天明白他回复的意思,最后似乎他并没有接受
> 别人提供的patch。
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> China-pm mailing list
> China-pm at pm.org
> http://mail.pm.org/mailman/listinfo/china-pm


-- 
Fayland Lam // http://www.fayland.org/ 
Foorum based on Catalyst // http://www.foorumbbs.com/ 



More information about the China-pm mailing list