DBIx::Custom::Result

简介

DBIx::Custom::Result模块是对 select 语句查询结果的封装。

# Result
my $result = $dbi->select(table => 'book');

# Fetch a row and put it into array reference
while (my $row = $result->fetch) {
  my $author = $row->[0];
  my $title  = $row->[1];
}

# Fetch only a first row and put it into array reference
my $row = $result->fetch_one;

# Fetch all rows and put them into array of array reference
my $rows = $result->fetch_all;

# Fetch a row and put it into hash reference
while (my $row = $result->fetch_hash) {
  my $title  = $row->{title};
  my $author = $row->{author};
}

# Fetch only a first row and put it into hash reference
my $row = $result->fetch_hash_one;
my $row = $result->one; # Alias for "fetch_hash_one"

# Fetch all rows and put them into array of hash reference
my $rows = $result->fetch_hash_all;
my $rows = $result->all; # Alias for "fetch_hash_all"

属性

dbi

my $dbi = $result->dbi;
$result = $result->dbi($dbi);

DBIx::Custom对象。

sth

my $sth = $reuslt->sth
$result = $result->sth($sth);

DBI的Statement 句柄。

stash

my $stash = $result->stash;
my $foo = $result->stash->{foo};
$result->stash->{foo} = $foo;

用于存储数据的hashref。

方法

DBIx::Custom::Result模块了Object::Simple中的所有方法,并实现了以下方法。

all

my $rows = $result->all;

和 fetch_hash_all 功能完全一样,其实这个方法只是fetch_hash_all方法的别名。

fetch

my $row = $result->fetch;

从查询结果中获取一行并以数组引用的方式返回。

fetch_all

my $rows = $result->fetch_all;

从查询结果中以数组引用的格式获取所有行并将其放入数组引用中返回。实现代码如下:

sub fetch_all {
  my $self = shift;

  # Fetch all rows
  my $rows = [];
  while(my $row = $self->fetch) { push @$rows, $row}

  return $rows;
}

fetch_one

my $row = $result->fetch_one;

仅从查询结果中获取第一行,并将其以数组引用的方式返回,然后结束Statement 句柄。实现代码如下:

sub fetch_one {
  my $self = shift;

  # Fetch
  my $row = $self->fetch;
  return unless $row;

  # Finish statement handle
  $self->sth->finish;

  return $row;
}

fetch_hash

my $row = $result->fetch_hash;

从查询结果中获取一行并以哈希引用的方式返回。

fetch_hash_all

my $rows = $result->fetch_hash_all;

从查询结果中以哈希引用的格式获取所有行并将其放入数组引用中返回。实现代码如下:

sub fetch_hash_all {
  my $self = shift;

  # Fetch all rows as hash
  my $rows = [];
  while(my $row = $self->fetch_hash) { push @$rows, $row }

  return $rows;
}

fetch_hash_one

my $row = $result->fetch_hash_one;

仅从查询结果中获取第一行,并将其以哈希引用的方式返回,然后结束Statement 句柄。实现代码如下:

sub fetch_hash_one {
  my $self = shift;

  # Fetch hash
  my $row = $self->fetch_hash;
  return unless $row;

  # Finish statement handle
  $self->sth->finish;

  return $row;
}

fetch_hash_multi

my $rows = $result->fetch_hash_multi(5);

从查询结果中以哈希引用的格式获取多行(由参数指定)并将其放入数组引用中返回。实现代码如下:

sub fetch_hash_multi {
  my ($self, $count) = @_;

  # Fetch multiple rows
  croak 'Row count must be specified ' . _subname  unless $count;

  return if $self->{_finished};

  my $rows = [];
  for (my $i = 0; $i < $count; $i++) {
    my $row = $self->fetch_hash;
    unless ($row) {
      $self->{_finished} = 1;
      last;
    }
    push @$rows, $row;
  }

  return unless @$rows;
  return $rows;
}

fetch_multi

my $rows = $result->fetch_multi(5);

从查询结果中以数组引用的格式获取多行(由参数指定)并将其放入数组引用中返回。实现代码如下:

sub fetch_multi {
  my ($self, $count) = @_;

  # Row count not specified
  croak 'Row count must be specified ' . _subname   unless $count;

  return if $self->{_finished};

  # Fetch multi rows
  my $rows = [];
  for (my $i = 0; $i < $count; $i++) {
    my $row = $self->fetch;
    unless ($row) {
      $self->{_finished} = 1;
      last;
    }
    push @$rows, $row;
  }

  return unless @$rows;
  return $rows;
}

filter

$result->filter(title  => sub { uc $_[0] }, author => 'to_upper');
$result->filter([qw/title author/] => 'to_upper');

在这个方法中,你可以使用subroutine或在DBIx::Custom中使用 register_filter 方法设置的“过滤器”名称,为查询结果中的数据列设置过滤器。这里设置的过滤器,会在DBIx::Custom早使用type_rule方法设置的过滤器之后执行。

flat

my @list = $result->flat;

从查询结果中以数组方式获取所有行,并将他们合并到一个列表中返回。

my @list = $dbi->select(['id', 'title'])->flat; ## (1, 'Perl', 2, 'Ruby')

您使用此方法可以轻松创建键值对列表(哈希结构)。

my %titles = $dbi->select(['id', 'title'])->flat;

此方法的实现代码如下:

sub flat {
  my $self = shift;

  my @flat;
  while (my $row = $self->fetch) {
    push @flat, @$row;
  }
  return @flat;
}

kv

my $key_value = $result->kv;

获取键值对。

my $books = $dbi->select(['id', 'title', 'author'])->kv;

如果调用all方法返回以下数据:

[
  {id => 1, title => 'Perl', author => 'Ken'},
  {id => 2, title => 'Ruby', author => 'Taro'}
]

而 kv 方法返回以下数据。

{
  1 => {title => 'Perl', author => 'Ken'},
  2 => {title => 'Ruby', author => 'Taro'}
}

在查询语句中第一列的值会被作为kv方法返回结果中的键。kv 方法的实现代码如下:

sub kv {
  my ($self, %opt) = @_;

  my $key_name = $self->{sth}{NAME}[0];
  my $kv = {};
  while (my $row = $self->fetch_hash) {
    my $key_value = delete $row->{$key_name};
    next unless defined $key_value;
    if ($opt{multi}) {
      _deprecate('0.28', "DBIx::Custom::Result::kv method's "
        . 'multi option is DEPRECATED. use kvs method instead');
      $kv->{$key_value} ||= [];
      push @{$kv->{$key_value}}, $row;
    }
    else { $kv->{$key_value} = $row }
  }

  return $kv;
}

kvs

my $key_values = $result->kvs;

获取键值对,与kv方法不同的是,在这里获取的结果中 value是以数组引用的格式存在的。如果一个key可能对应多个value时应该使用此方法,而不是kv方法。

my $books = $dbi->select(['author', 'title', 'price'])->kvs;

如果调用all方法返回以下数据:

[
  {author => 'Ken', title => 'Perl', price => 1000},
  {author => 'Ken', title => 'Good', price => 2000},
  {author => 'Taro', title => 'Ruby', price => 3000}
  {author => 'Taro', title => 'Sky', price => 4000}
]

kvs 方法返回以下数据。

{
  Ken => [
    {title => 'Perl', price => 1000},
    {title => 'Good', price => 2000}
  ],
  Taro => [
    {title => 'Ruby', price => 3000},
    {title => 'Sky', price => 4000}
  ]
}

kvs方法的实现代码如下:

sub kvs {
  my ($self, %opt) = @_;

  my $key_name = $self->{sth}{NAME}[0];
  my $kv = {};
  while (my $row = $self->fetch_hash) {
    my $key_value = delete $row->{$key_name};
    next unless defined $key_value;
    $kv->{$key_value} ||= [];
    push @{$kv->{$key_value}}, $row;
  }

  return $kv;
}

header

my $header = $result->header;

获取表头,也就是查询结果中每一列的名称。

one

my $row = $result->one;

与 fetch_hash_one 方法的功能完全相同。

type_rule

感觉官方文档写的有点问题,所以暂时不做翻译。

type_rule_off

$result = $result->type_rule_off;

关闭 type_rule中的from1和from2过滤规则,默认情况下是开着的。

type_rule_on

$result = $result->type_rule_on;

打开 type_rule中的from1和from2过滤规则,默认情况下是开着的。

type_rule1_off

$result = $result->type_rule1_off;

关闭 type_rule中的from1过滤规则,默认情况下是开着的。

type_rule1_on

$result = $result->type_rule1_on;

打开 type_rule中的from1过滤规则,默认情况下是开着的。

type_rule2_off

$result = $result->type_rule2_off;

关闭 type_rule中的from2过滤规则,默认情况下是开着的。

type_rule2_on

$result = $result->type_rule2_on;

打开 type_rule中的from2过滤规则,默认情况下是开着的。

value

my $value = $result->value;

从查询结果中获取第一行中第一列的值。

my $count = $dbi->select('count(*)', table => 'book')->value;
## 等价于
my $count = $dbi->select('count(*)')->fetch_one->[0];

value的实现代码如下:

sub value {
  my $self = shift;
  my $row = $self->fetch_one;
  my $value = $row ? $row->[0] : undef;
  return $value;
}

values

my $values = $result->values;

从查询结果中获取所有行中第一列的值。

my $tables = $dbi->select('show tables')->values;
## 等价于
my $rows = $dbi->select('show tables')->fetch_all;
my $tables = [map { $_->[0] } @$rows];

values的实现代码如下:

sub values {
  my $self = shift;

  my $values = [];
  my $rows = $self->fetch_all;
  push @$values, $_->[0] for @$rows;
  return $values;
}

1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,570评论 18 139
  • 简介 DBIx::Custom是一个DBI的包装器,此模块具有以下功能: 可以更容易的执行insert、updat...
    JSON_NULL阅读 582评论 0 3
  • PHP常用函数大全 usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解...
    上街买菜丶迷倒老太阅读 1,347评论 0 20
  • 瞬间“小满足” 幸福感是朋友圈最热门的话题之一,我一小友曾恨恨地说,刷烂了的心灵鸡汤,腐蚀了...
    大图图阅读 198评论 0 0
  • 人因梦想而伟大。这句话越长大越被抛弃的彻底,因为我们后来都不相信梦想,或者说,梦想变成了物质基础。如果没有了...
    昼夜思阅读 221评论 0 0