1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| # 言語: perl
# バージョン: 5.36以上
# 依存: Moo
package QueryBuilder;
use v5.36;
use Moo;
has _table => (is => 'rw');
has _columns => (is => 'rw', default => sub { [] });
has _conditions => (is => 'rw', default => sub { [] });
has _orders => (is => 'rw', default => sub { [] });
has _limit => (is => 'rw');
has _bind_values => (is => 'rw', default => sub { [] });
sub from ($self, $table) {
$self->_table($table);
return $self;
}
sub select ($self, @columns) {
push $self->_columns->@*, @columns;
return $self;
}
sub where ($self, $column, $value) {
push $self->_conditions->@*, { column => $column };
push $self->_bind_values->@*, $value; # 値は別配列に保存
return $self;
}
sub order_by ($self, $column, $dir = 'ASC') {
push $self->_orders->@*, { column => $column, dir => $dir };
return $self;
}
sub limit ($self, $count) {
$self->_limit($count);
return $self;
}
# SQLを生成(プレースホルダー版)
sub build ($self) {
my @columns = $self->_columns->@*;
my $cols = @columns ? CORE::join(', ', @columns) : '*';
my $sql = "SELECT $cols FROM " . $self->_table;
if ($self->_conditions->@*) {
my @wheres;
for my $cond ($self->_conditions->@*) {
push @wheres, "$cond->{column} = ?"; # プレースホルダー
}
$sql .= " WHERE " . CORE::join(' AND ', @wheres);
}
if ($self->_orders->@*) {
my @orders;
for my $ord ($self->_orders->@*) {
push @orders, "$ord->{column} $ord->{dir}";
}
$sql .= " ORDER BY " . CORE::join(', ', @orders);
}
if ($self->_limit) {
$sql .= " LIMIT " . $self->_limit;
}
return $sql;
}
# バインド値を取得
sub bind_values ($self) {
return $self->_bind_values->@*;
}
1;
|