<br><br><div class="gmail_quote">2008/3/18 Fayland Lam &lt;<a href="mailto:fayland@gmail.com">fayland@gmail.com</a>&gt;:<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>
&gt; 2008/3/18 cui robin &lt;<a href="mailto:cuiyuming@gmail.com">cuiyuming@gmail.com</a> &lt;mailto:<a href="mailto:cuiyuming@gmail.com">cuiyuming@gmail.com</a>&gt;&gt;:<br>
<div class="Ih2E3d">&gt;<br>
&gt; &nbsp; &nbsp; HI,<br>
&gt; &nbsp; &nbsp; 我是昨天问过DBIC数据向JSON转换的家伙,在fayland的提示下,开始使用<br>
&gt; &nbsp; &nbsp; DBIC中包含的的HashRefInflator模块,将结果先转换成hash,然后再用<br>
&gt; &nbsp; &nbsp; Catalyst::View::JSON转成JSON。<br>
&gt; &nbsp; &nbsp; 可是我发现个问题,如果我用resultset的find方法,如下:DataDumper可<br>
&gt; &nbsp; &nbsp; 以看出得到一个正确的Hash结果,但是如果使用 search得到的结果,其中<br>
&gt; &nbsp; &nbsp; 的内容还是object的,很多冗余信息。<br>
&gt; &nbsp; &nbsp; 大家有遇到这个问题么?<br>
&gt;<br>
&gt; &nbsp; &nbsp; #! /usr/bin/perl<br>
&gt; &nbsp; &nbsp; use lib &#39;./&#39;;<br>
&gt; &nbsp; &nbsp; use CBSDB;<br>
&gt; &nbsp; &nbsp; use Data::Dumper;<br>
&gt; &nbsp; &nbsp; use DBIx::Class::ResultClass::HashRefInflator;<br>
&gt;<br>
&gt; &nbsp; &nbsp; my $dsn=&#39;dbi:mysql:dbStatus;192.168.182.5&#39;;<br>
&gt; &nbsp; &nbsp; my $user=&#39;dbstatus&#39;;<br>
&gt; &nbsp; &nbsp; my $pass=&#39;dbstatus&#39;;<br>
&gt; &nbsp; &nbsp; my $schema = CBSDB-&gt;connect($dsn,$user,$pass);<br>
&gt; &nbsp; &nbsp; $schema-&gt;storage-&gt;debug(1);<br>
&gt;<br>
&gt; &nbsp; &nbsp; my $rs_base_mach = $schema-&gt;resultset(&#39;Base_mach&#39;);<br>
&gt; &nbsp; &nbsp; $rs_base_mach-&gt;result_class(&#39;DBIx::Class::ResultClass::HashRefInflator&#39;);<br>
&gt; &nbsp; &nbsp; #$base_mach = [$rs_base_mach-&gt;search({&#39;me.app&#39; =&gt;<br>
&gt; &nbsp; &nbsp; &#39;Penguin&#39;},{join=&gt;&#39;mach_group&#39;,prefetch=&gt;&#39;mach_group&#39;})];<br>
</div>&gt; &nbsp; &nbsp; $base_mach=$rs_base_mach-&gt;find(&#39;<a href="http://172.24.68.93" target="_blank">172.24.68.93</a> &lt;<a href="http://172.24.68.93" target="_blank">http://172.24.68.93</a>&gt;&#39;);<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; print Data::Dumper-&gt;Dumper($base_mach);<br>
&gt;<br>
&gt; &nbsp; &nbsp; robincui<br>
&gt;<br>
&gt;<br>
&gt; 我尝试昨天fayland说的另外一个方法是可以的,如下:<br>
&gt; my $rs_base_mach = $schema-&gt;resultset(&#39;Base_mach&#39;);<br>
&gt; $rs_base_mach-&gt;result_class(&#39;DBIx::Class::ResultClass::HashRefInflator&#39;);<br>
&gt; @base_mach = $rs_base_mach-&gt;search({&#39;me.app&#39; =&gt;<br>
&gt; &#39;Penguin&#39;},{join=&gt;&#39;mach_group&#39;,prefetch=&gt;&#39;mach_group&#39;});<br>
&gt; for (@base_mach) {<br>
&gt; $_ = $_-&gt;{_column_data};<br>
&gt; }<br>
&gt; print Data::Dumper-&gt;Dumper(\@base_mach);<br>
&gt;<br>
&gt; 不明白为什么昨天fayland邮件里说如果有relationship的话会有什么问题么?<br>
&gt;<br>
&gt; 比如 @a = $c-&gt;model(&#39;X&#39;)-&gt;all; foreach (@a) { $_ = $_-&gt;{_column_data} }<br>
&gt; 这样。这样的情况是没有 relationship.<br>
&gt; 有的话,还是去查询 DBIx::Class 的 doc 好了。有个 HashRef 的 模块。<br>
<br>
</div>我的意思是,比如你的<br>
<div class="Ih2E3d">#$base_mach = [$rs_base_mach-&gt;search({&#39;me.app&#39; =&gt;<br>
&#39;Penguin&#39;},{join=&gt;&#39;mach_group&#39;,prefetch=&gt;&#39;mach_group&#39;})];<br>
</div>这里有个 join prefetch<br>
然后用 $_ = $_-&gt;{_column_data}, 这个 join prefetch 就没了。<br>
将 DBIC object 转为 hash 一般是用 HashRefInflator<br>
如果行不通的话,就手工转呗。<br>
<br>
大不了这么写<br>
my $whatIwant = {<br>
a =&gt; $base_mach-&gt;a,<br>
b =&gt; $base_mach-&gt;b,<br>
c =&gt; $base_mach-&gt;c-&gt;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-&gt;search(<br>
{&#39;me.app&#39; =&gt; &#39;Penguin&#39;,&#39;ip&#39;=&gt;&#39;<a href="http://172.24.68.93">172.24.68.93</a>&#39;},<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join=&gt;&#39;mach_group&#39;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #prefetch=&gt;&#39;mach_group&#39;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; columns=&gt;[qw/me.app me.cat me.hostname me.ip mach_group.mail_to/]<br>
}<br>
)];<br>
得到:<br>
</div>$VAR2 = [<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;app&#39; =&gt; &#39;Penguin&#39;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;cat&#39; =&gt; &#39;userdb&#39;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;mach_group&#39; =&gt; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;mail_to&#39; =&gt; &#39;robincui&#39;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;ip&#39; =&gt; &#39;<a href="http://172.24.68.93">172.24.68.93</a>&#39;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;hostname&#39; =&gt; &#39;ABCD&#39;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]; <br>
<br>
折腾这么多,也许你说的对,就手工弄呗。<br>
<br>
那个resultset的cursor方法不错。可以直接得到二维的value array。<br>
只是又不知道如何直接得到那些select的column name?<br>
到今天也是刚研究DBIC这个东东3,4天,老实说,不习惯,不是很爽。CDBI大家用过么,好用么?</div><br><br>