<br><br><div class="gmail_quote">2008/3/18 Fayland Lam <<a href="mailto:fayland@gmail.com">fayland@gmail.com</a>>:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
cui robin wrote:<br>
> 2008/3/18 cui robin <<a href="mailto:cuiyuming@gmail.com">cuiyuming@gmail.com</a> <mailto:<a href="mailto:cuiyuming@gmail.com">cuiyuming@gmail.com</a>>>:<br>
<div class="Ih2E3d">><br>
> HI,<br>
> 我是昨天问过DBIC数据向JSON转换的家伙,在fayland的提示下,开始使用<br>
> DBIC中包含的的HashRefInflator模块,将结果先转换成hash,然后再用<br>
> Catalyst::View::JSON转成JSON。<br>
> 可是我发现个问题,如果我用resultset的find方法,如下:DataDumper可<br>
> 以看出得到一个正确的Hash结果,但是如果使用 search得到的结果,其中<br>
> 的内容还是object的,很多冗余信息。<br>
> 大家有遇到这个问题么?<br>
><br>
> #! /usr/bin/perl<br>
> use lib './';<br>
> use CBSDB;<br>
> use Data::Dumper;<br>
> use DBIx::Class::ResultClass::HashRefInflator;<br>
><br>
> my $dsn='dbi:mysql:dbStatus;192.168.182.5';<br>
> my $user='dbstatus';<br>
> my $pass='dbstatus';<br>
> my $schema = CBSDB->connect($dsn,$user,$pass);<br>
> $schema->storage->debug(1);<br>
><br>
> my $rs_base_mach = $schema->resultset('Base_mach');<br>
> $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');<br>
> #$base_mach = [$rs_base_mach->search({'me.app' =><br>
> 'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];<br>
</div>> $base_mach=$rs_base_mach->find('<a href="http://172.24.68.93" target="_blank">172.24.68.93</a> <<a href="http://172.24.68.93" target="_blank">http://172.24.68.93</a>>');<br>
<div class="Ih2E3d">> print Data::Dumper->Dumper($base_mach);<br>
><br>
> robincui<br>
><br>
><br>
> 我尝试昨天fayland说的另外一个方法是可以的,如下:<br>
> my $rs_base_mach = $schema->resultset('Base_mach');<br>
> $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');<br>
> @base_mach = $rs_base_mach->search({'me.app' =><br>
> 'Penguin'},{join=>'mach_group',prefetch=>'mach_group'});<br>
> for (@base_mach) {<br>
> $_ = $_->{_column_data};<br>
> }<br>
> print Data::Dumper->Dumper(\@base_mach);<br>
><br>
> 不明白为什么昨天fayland邮件里说如果有relationship的话会有什么问题么?<br>
><br>
> 比如 @a = $c->model('X')->all; foreach (@a) { $_ = $_->{_column_data} }<br>
> 这样。这样的情况是没有 relationship.<br>
> 有的话,还是去查询 DBIx::Class 的 doc 好了。有个 HashRef 的 模块。<br>
<br>
</div>我的意思是,比如你的<br>
<div class="Ih2E3d">#$base_mach = [$rs_base_mach->search({'me.app' =><br>
'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];<br>
</div>这里有个 join prefetch<br>
然后用 $_ = $_->{_column_data}, 这个 join prefetch 就没了。<br>
将 DBIC object 转为 hash 一般是用 HashRefInflator<br>
如果行不通的话,就手工转呗。<br>
<br>
大不了这么写<br>
my $whatIwant = {<br>
a => $base_mach->a,<br>
b => $base_mach->b,<br>
c => $base_mach->c->real,<br>
<br>
之类的。</blockquote><br><div>后来再仔细看明白你的意思。就是简单的引用<br>
噢,后来仔细看那个object的dump结果才明白你的意思了,简单的_column_data确实是没有得到join表的数据。我晕死!!<br>
另外我用了<a href="http://lists.scsys.co.uk/pipermail/dbix-class/2008-February/005733.html">http://lists.scsys.co.uk/pipermail/dbix-class/2008-February/005733.html</a><br>
给出的patch后,运行基本正常,可以得到hashref了,但是这样对于relationship返回的hashref并不是一个二维的结构体,join关系得到的列还是被嵌套了的。不爽的说!<br>
具体如下,改了一下search:<br>
$base_mach = [$rs_base_mach->search(<br>
{'me.app' => 'Penguin','ip'=>'<a href="http://172.24.68.93">172.24.68.93</a>'},<br>
{<br>
join=>'mach_group',<br>
#prefetch=>'mach_group',<br>
columns=>[qw/me.app me.cat me.hostname me.ip mach_group.mail_to/]<br>
}<br>
)];<br>
得到:<br>
</div>$VAR2 = [<br>
{<br>
'app' => 'Penguin',<br>
'cat' => 'userdb',<br>
'mach_group' => {<br>
'mail_to' => 'robincui'<br>
},<br>
'ip' => '<a href="http://172.24.68.93">172.24.68.93</a>',<br>
'hostname' => 'ABCD'<br>
}<br>
]; <br>
<br>
折腾这么多,也许你说的对,就手工弄呗。<br>
<br>
那个resultset的cursor方法不错。可以直接得到二维的value array。<br>
只是又不知道如何直接得到那些select的column name?<br>
到今天也是刚研究DBIC这个东东3,4天,老实说,不习惯,不是很爽。CDBI大家用过么,好用么?</div><br><br>