Mojolicious数据库操作(十二)

之前的几篇,我们已经讲完了mojo::mysql::database模块中db对象的所有方法。本篇起,我们要讲一个常用的,且十分重要的对象,便是db对象方法返回的结果——results对象。

Mojo::mysql::Results是mojo::mysql::database方法返回语句句柄的容器。

results有两个属性,db和sth。

其中db属性代表mojo::mysql::dtabase对象,sth代表着mojo::mysql::database对象的某个方法返回的SQL语句句柄的结果:

#db属性
my $db = $results->db;
$results = $results->db(Mojo::mysql::Database->new);
#sth属性
my $sth = $results->sth;
$results = $results->sth($sth);

下面开始我们讲results的方法,首先要说明的是results模块继承自Mojo::Base,该模块的所有方法都可以用在results对象中。

一、array

my $array = $results->array;

results对象调用该方法可以返回一个数组引用。该数组引用代表着数据库中获取的一行数据,每一个字段按照固定的顺序在这个数组中排列着。

大家此时会有一个疑问,如果是select查询语句,可能会返回多行数据。此时,我们使用一个while循环即可:

while (my $next = $results->array) {
  say $next->[3];                            #返回每一行的第三个字段的值
}

二、arrays

my $collection = $results->arrays;

arrays方法返回一个数组引用的数组引用。什么意思呢?数据行的数组引用,举个例子,当我使用select * from table返回的所有行数据会组成一个数组引用,而每一行的各个字段会组成一个数组引用(这个数组引用便是前面那个数组引用的成员):

say $results->arrays->reduce(sub { $a->[3] + $b->[3] }); #将每一个数据的第三个字段的值相加。

三、columns

my $columns = $results->columns;

返回一个数组引用,数组中的成员是列,也就是字段的名字。

四、expand

前一篇博文中我们提到过,该方法是将数据库字段中存放的json数据解析为perl的数据结构。

$results = $results->expand;
$results = $results->expand(1);

当该方法的参数为1时会将所有的列扩展为一个json数组或对象

# Expand JSON
$results->expand->hashes->map(sub { $_->{foo}{bar} })->join("\n")->say;
#将results对象扩展为一个散列数组引用,然后通过map方法提取bar的值,生成数组后用回车符连接成字符串,显示出来。

标签