| ... | ... |
@@ -1,3 +1,6 @@ |
| 1 |
+0.1650 |
|
| 2 |
+ - add experimental DBIx::Custom::Model name() attribute |
|
| 3 |
+ - remove name specified feature from experimantal include_model(). |
|
| 1 | 4 |
0.1649 |
| 2 | 5 |
- add experimental DBIx::Custom::Model column_clause() method. |
| 3 | 6 |
- select method column option can receive string. |
| ... | ... |
@@ -1,6 +1,6 @@ |
| 1 | 1 |
package DBIx::Custom; |
| 2 | 2 |
|
| 3 |
-our $VERSION = '0.1649'; |
|
| 3 |
+our $VERSION = '0.1650'; |
|
| 4 | 4 |
|
| 5 | 5 |
use 5.008001; |
| 6 | 6 |
use strict; |
| ... | ... |
@@ -741,14 +741,19 @@ sub include_model {
|
| 741 | 741 |
|
| 742 | 742 |
foreach my $model_info (@$model_infos) {
|
| 743 | 743 |
|
| 744 |
- # Model name and class |
|
| 745 |
- my $model_name; |
|
| 744 |
+ # Model class, name, table |
|
| 746 | 745 |
my $model_class; |
| 746 |
+ my $model_name; |
|
| 747 |
+ my $model_table; |
|
| 747 | 748 |
if (ref $model_info eq 'HASH') {
|
| 748 |
- $model_name = (keys %$model_info)[0]; |
|
| 749 |
- $model_class = $model_info->{$model_name};
|
|
| 749 |
+ $model_class = $model_info->{class};
|
|
| 750 |
+ $model_name = $model_info->{name};
|
|
| 751 |
+ $model_table = $model_info->{table};
|
|
| 752 |
+ |
|
| 753 |
+ $model_name ||= $model_class; |
|
| 754 |
+ $model_table ||= $model_name; |
|
| 750 | 755 |
} |
| 751 |
- else { $model_name = $model_class = $model_info }
|
|
| 756 |
+ else { $model_class =$model_name = $model_table = $model_info }
|
|
| 752 | 757 |
my $mclass = "${name_space}::$model_class";
|
| 753 | 758 |
|
| 754 | 759 |
# Load |
| ... | ... |
@@ -761,10 +766,11 @@ sub include_model {
|
| 761 | 766 |
|
| 762 | 767 |
# Instantiate |
| 763 | 768 |
my $model = $mclass->new(dbi => $self); |
| 764 |
- $model->table($model_name) unless $model->table; |
|
| 769 |
+ $model->name($model_name) unless $model->name; |
|
| 770 |
+ $model->table($model_table) unless $model->table; |
|
| 765 | 771 |
|
| 766 | 772 |
# Set |
| 767 |
- $self->model($model_name, $model); |
|
| 773 |
+ $self->model($model->name, $model); |
|
| 768 | 774 |
} |
| 769 | 775 |
return $self; |
| 770 | 776 |
} |
| ... | ... |
@@ -1005,41 +1005,44 @@ L<DBIx::Custom::Where> object is embedded into SQL. |
| 1005 | 1005 |
you can define model extending L<DBIx::Custom::Model> |
| 1006 | 1006 |
to improve source code view. |
| 1007 | 1007 |
|
| 1008 |
- package MyModel::book; |
|
| 1009 |
- use base 'DBIx::Custom::Model'; |
|
| 1010 |
- |
|
| 1011 |
- sub insert { ... }
|
|
| 1012 |
- sub list { ... }
|
|
| 1013 |
- |
|
| 1014 |
-You can include and instantiate this class |
|
| 1008 |
+At first, you create basic model class extending <DBIx::Custom::Model>. |
|
| 1015 | 1009 |
|
| 1016 |
- $dbi->include_model( |
|
| 1017 |
- MyModel => [ |
|
| 1018 |
- 'book', |
|
| 1019 |
- ] |
|
| 1020 |
- ); |
|
| 1010 |
+ package MyModel; |
|
| 1011 |
+ |
|
| 1012 |
+ use base 'DBIx::Custom::Model'; |
|
| 1021 | 1013 |
|
| 1022 |
-First argument is name space. |
|
| 1023 |
-Second argument is array reference of class base names. |
|
| 1014 |
+Next, you create each model classes. |
|
| 1024 | 1015 |
|
| 1025 |
-If you don't specify second argument, All models under name space is |
|
| 1026 |
-included. |
|
| 1016 |
+MyModel::book |
|
| 1027 | 1017 |
|
| 1028 |
- $dbi->include_model('MyModel');
|
|
| 1018 |
+ package MyModel::book; |
|
| 1019 |
+ |
|
| 1020 |
+ use base 'MyModel'; |
|
| 1021 |
+ |
|
| 1022 |
+ sub insert { ... }
|
|
| 1023 |
+ sub list { ... }
|
|
| 1029 | 1024 |
|
| 1030 |
-Note that in this case name spece module is needed. |
|
| 1025 |
+MyModel::company |
|
| 1031 | 1026 |
|
| 1032 |
- # MyModel.pm |
|
| 1033 |
- package MyModel; |
|
| 1027 |
+ package MyModel::company; |
|
| 1034 | 1028 |
|
| 1035 |
- use base 'DBIx::Custom::Model'; |
|
| 1029 |
+ use base 'MyModel'; |
|
| 1030 |
+ |
|
| 1031 |
+ sub insert { ... }
|
|
| 1032 |
+ sub list { ... }
|
|
| 1036 | 1033 |
|
| 1037 | 1034 |
The follwoing modules location is needed. |
| 1038 | 1035 |
|
| 1039 | 1036 |
MyModel.pm |
| 1040 | 1037 |
MyModel / book.pm |
| 1041 | 1038 |
/ company.pm |
| 1042 |
- |
|
| 1039 |
+ |
|
| 1040 |
+You can include these models by C<include_model()> |
|
| 1041 |
+ |
|
| 1042 |
+ $dbi->include_model('MyModel');
|
|
| 1043 |
+ |
|
| 1044 |
+First argument is name space of model. |
|
| 1045 |
+ |
|
| 1043 | 1046 |
You can use model like this. |
| 1044 | 1047 |
|
| 1045 | 1048 |
my $result = $dbi->model('book')->list;
|
| ... | ... |
@@ -1096,6 +1099,40 @@ You can set C<relation> |
| 1096 | 1099 |
|
| 1097 | 1100 |
This relation is used by C<select()>, C<select_at()> |
| 1098 | 1101 |
|
| 1102 |
+=head2 Class name, Model name, Table name |
|
| 1103 |
+ |
|
| 1104 |
+Class name, model name, and table name is a little different. |
|
| 1105 |
+Generally Class name is model name, and table name is model name. |
|
| 1106 |
+ |
|
| 1107 |
+ CLASS MODEL TABLE |
|
| 1108 |
+ book (CLASS) -> book (MODEL) -> book |
|
| 1109 |
+ |
|
| 1110 |
+You can change model name. |
|
| 1111 |
+ |
|
| 1112 |
+ package MyModel::book; |
|
| 1113 |
+ |
|
| 1114 |
+ __PACAKGE__->attr(name => 'book_model'); |
|
| 1115 |
+ |
|
| 1116 |
+ CLASS MODEL TABLE |
|
| 1117 |
+ book book_model (MODEL) -> book_model |
|
| 1118 |
+ |
|
| 1119 |
+Model name is the name used by L<model()> of L<DBIx::Custom>. |
|
| 1120 |
+ |
|
| 1121 |
+ $dbi->model('book_model');
|
|
| 1122 |
+ |
|
| 1123 |
+You can change table name. |
|
| 1124 |
+ |
|
| 1125 |
+ package MyModel::book; |
|
| 1126 |
+ |
|
| 1127 |
+ __PACAKGE__->attr(table => 'book_table'); |
|
| 1128 |
+ |
|
| 1129 |
+ CLASS MODEL TABLE |
|
| 1130 |
+ book (CLASS) -> book book_table |
|
| 1131 |
+ |
|
| 1132 |
+Table name is the table really accessed. |
|
| 1133 |
+ |
|
| 1134 |
+ $dbi->model('book')->insert(...); # access to "book_table"
|
|
| 1135 |
+ |
|
| 1099 | 1136 |
=head2 Create column clause automatically : column_clause() |
| 1100 | 1137 |
|
| 1101 | 1138 |
To create column clause automatically, use C<column_clause()>. |
| ... | ... |
@@ -1032,42 +1032,45 @@ C<execute()>との連携です。SQLを作成するときに埋め込むこと |
| 1032 | 1032 |
ソースコードの見通しをよくするために、 |
| 1033 | 1033 |
L<DBIx::Custom::Model>を継承してモデルを作成することができます。 |
| 1034 | 1034 |
|
| 1035 |
- package MyModel::book; |
|
| 1036 |
- use base 'DBIx::Custom::Model'; |
|
| 1037 |
- |
|
| 1038 |
- sub insert { ... }
|
|
| 1039 |
- sub list { ... }
|
|
| 1040 |
- |
|
| 1041 |
-このクラスを取り込んで、インスタンス化することができます。 |
|
| 1035 |
+まず最初にモデルの元になるクラスを<DBIx::Custom::Model> |
|
| 1036 |
+を継承して作成します。 |
|
| 1042 | 1037 |
|
| 1043 |
- $dbi->include_model( |
|
| 1044 |
- MyModel => [ |
|
| 1045 |
- 'book', |
|
| 1046 |
- ] |
|
| 1047 |
- ); |
|
| 1038 |
+ package MyModel; |
|
| 1039 |
+ |
|
| 1040 |
+ use base 'DBIx::Custom::Model'; |
|
| 1048 | 1041 |
|
| 1049 |
-最初の引数は名前空間です。第二引数は、クラスの末尾の名前を含む |
|
| 1050 |
-配列のリファレンスです。 |
|
| 1042 |
+次に個々のモデルクラスを作成します。 |
|
| 1051 | 1043 |
|
| 1052 |
-第二引数を指定しなかった場合は、名前空間以下にあるすべてのモデル |
|
| 1053 |
-が取り込まれます。 |
|
| 1044 |
+MyModel::book |
|
| 1054 | 1045 |
|
| 1055 |
- $dbi->include_model('MyModel');
|
|
| 1046 |
+ package MyModel::book; |
|
| 1047 |
+ |
|
| 1048 |
+ use base 'MyModel'; |
|
| 1049 |
+ |
|
| 1050 |
+ sub insert { ... }
|
|
| 1051 |
+ sub list { ... }
|
|
| 1056 | 1052 |
|
| 1057 |
-ただし、名前空間名そのものを表すモジュールが |
|
| 1058 |
-存在していることが必要なことに注意してください。 |
|
| 1053 |
+MyModel::company |
|
| 1059 | 1054 |
|
| 1060 |
- # MyModel.pm |
|
| 1061 |
- package MyModel; |
|
| 1055 |
+ package MyModel::company; |
|
| 1062 | 1056 |
|
| 1063 |
- use base 'DBIx::Custom::Model'; |
|
| 1057 |
+ use base 'MyModel'; |
|
| 1058 |
+ |
|
| 1059 |
+ sub insert { ... }
|
|
| 1060 |
+ sub list { ... }
|
|
| 1064 | 1061 |
|
| 1065 |
-次のようなモジュールの配置が必要です。 |
|
| 1062 |
+このように作成したモジュールを次のように配置してください。 |
|
| 1066 | 1063 |
|
| 1067 | 1064 |
MyModel.pm |
| 1068 | 1065 |
MyModel / book.pm |
| 1069 | 1066 |
/ company.pm |
| 1070 |
- |
|
| 1067 |
+ |
|
| 1068 |
+このように作成したモデルはC<include_model()>で取り込むことができます。 |
|
| 1069 |
+ |
|
| 1070 |
+ $dbi->include_model('MyModel');
|
|
| 1071 |
+ |
|
| 1072 |
+第一引数は、モデルの名前空間になります。 |
|
| 1073 |
+ |
|
| 1071 | 1074 |
モデルは次のように利用することができます。 |
| 1072 | 1075 |
|
| 1073 | 1076 |
my $result = $dbi->model('book')->list;
|
| ... | ... |
@@ -1131,6 +1134,40 @@ C<select_at()>で利用されます。 |
| 1131 | 1134 |
|
| 1132 | 1135 |
ここで設定したリレーションはC<select()>, C<select_at()>で利用されます。 |
| 1133 | 1136 |
|
| 1137 |
+=head2 クラス名、モデル名、テーブル名 |
|
| 1138 |
+ |
|
| 1139 |
+クラス名とモデル名とテーブル名の関係について書いておきます。 |
|
| 1140 |
+通常はクラス名がモデル名に利用され、テーブル名にはモデル名が利用されます。 |
|
| 1141 |
+ |
|
| 1142 |
+ クラス名 モデル名 テーブル名 |
|
| 1143 |
+ book (クラス名) -> book (モデル名) -> book |
|
| 1144 |
+ |
|
| 1145 |
+モデル名を変更することもできます。 |
|
| 1146 |
+ |
|
| 1147 |
+ package MyModel::book; |
|
| 1148 |
+ |
|
| 1149 |
+ __PACAKGE__->attr(name => 'book_model'); |
|
| 1150 |
+ |
|
| 1151 |
+ クラス名 モデル名 テーブル名 |
|
| 1152 |
+ book book_model (モデル名) -> book_model |
|
| 1153 |
+ |
|
| 1154 |
+モデル名というのは、L<DBIx::Custom>のL<model()>で利用される名前です。 |
|
| 1155 |
+ |
|
| 1156 |
+ $dbi->model('book_model');
|
|
| 1157 |
+ |
|
| 1158 |
+テーブル名を変更することもできます。 |
|
| 1159 |
+ |
|
| 1160 |
+ package MyModel::book; |
|
| 1161 |
+ |
|
| 1162 |
+ __PACAKGE__->attr(table => 'book_table'); |
|
| 1163 |
+ |
|
| 1164 |
+ クラス名 モデル名 テーブル名 |
|
| 1165 |
+ book (クラス名) -> book book_table |
|
| 1166 |
+ |
|
| 1167 |
+テーブル名というのは、実際にアクセスされるテーブルです。 |
|
| 1168 |
+ |
|
| 1169 |
+ $dbi->model('book')->insert(...); # book_tableにアクセス
|
|
| 1170 |
+ |
|
| 1134 | 1171 |
=head2 列名の自動生成 : column_clause() |
| 1135 | 1172 |
|
| 1136 | 1173 |
列名の節を自動生成するにはC<column_clause()>を使用します。 |
| ... | ... |
@@ -11,7 +11,7 @@ use Carp 'croak'; |
| 11 | 11 |
push @DBIx::Custom::CARP_NOT, __PACKAGE__; |
| 12 | 12 |
|
| 13 | 13 |
__PACKAGE__->attr( |
| 14 |
- ['dbi', 'table'], |
|
| 14 |
+ ['dbi', 'name', 'table'], |
|
| 15 | 15 |
columns => sub { [] },
|
| 16 | 16 |
primary_key => sub { [] },
|
| 17 | 17 |
relation => sub { {} }
|
| ... | ... |
@@ -169,13 +169,21 @@ my $table = DBIx::Custom::Model->new(table => 'books'); |
| 169 | 169 |
|
| 170 | 170 |
L<DBIx::Custom> object. |
| 171 | 171 |
|
| 172 |
+=head2 C<name> |
|
| 173 |
+ |
|
| 174 |
+ my $name = $model->name; |
|
| 175 |
+ $model = $model->name('book');
|
|
| 176 |
+ |
|
| 177 |
+Model name. |
|
| 178 |
+ |
|
| 172 | 179 |
=head2 C<table> |
| 173 | 180 |
|
| 174 | 181 |
my $table = $model->table; |
| 175 | 182 |
$model = $model->table('book');
|
| 176 | 183 |
|
| 177 |
-Table name. |
|
| 178 |
- |
|
| 184 |
+Table name. Model name and table name is different. |
|
| 185 |
+Table name is real table name in database. |
|
| 186 |
+ |
|
| 179 | 187 |
=head2 C<primary_key> |
| 180 | 188 |
|
| 181 | 189 |
my $primary_key = $model->primary_key; |
| ... | ... |
@@ -1304,7 +1304,7 @@ like($@, qr/locate/); |
| 1304 | 1304 |
$self->include_model( |
| 1305 | 1305 |
MyModel2 => [ |
| 1306 | 1306 |
'book', |
| 1307 |
- {company => 'Company'}
|
|
| 1307 |
+ {class => 'Company', name => 'company'}
|
|
| 1308 | 1308 |
] |
| 1309 | 1309 |
); |
| 1310 | 1310 |
} |
| ... | ... |
@@ -1534,6 +1534,12 @@ $dbi->execute($CREATE_TABLE->{1});
|
| 1534 | 1534 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3});
|
| 1535 | 1535 |
$dbi->model('table1')->delete_at(where => [1, 2]);
|
| 1536 | 1536 |
is_deeply($dbi->select(table => 'table1')->fetch_hash_all, []); |
| 1537 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3});
|
|
| 1538 |
+$dbi->model('table1_1')->delete_at(where => [1, 2]);
|
|
| 1539 |
+is_deeply($dbi->select(table => 'table1')->fetch_hash_all, []); |
|
| 1540 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3});
|
|
| 1541 |
+$dbi->model('table1_3')->delete_at(where => [1, 2]);
|
|
| 1542 |
+is_deeply($dbi->select(table => 'table1')->fetch_hash_all, []); |
|
| 1537 | 1543 |
|
| 1538 | 1544 |
|
| 1539 | 1545 |
test 'update_at'; |
| ... | ... |
@@ -11,7 +11,7 @@ sub connect {
|
| 11 | 11 |
$self->include_model( |
| 12 | 12 |
MyModel1 => [ |
| 13 | 13 |
'book', |
| 14 |
- {company => 'Company'}
|
|
| 14 |
+ {class => 'Company', name => 'company'}
|
|
| 15 | 15 |
] |
| 16 | 16 |
); |
| 17 | 17 |
} |
| ... | ... |
@@ -0,0 +1,12 @@ |
| 1 |
+package MyModel5::table1_1; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'MyModel5'; |
|
| 7 |
+ |
|
| 8 |
+__PACKAGE__->attr(table => 'table1'); |
|
| 9 |
+ |
|
| 10 |
+__PACKAGE__->attr('primary_key' => sub { ['key1', 'key2'] });
|
|
| 11 |
+ |
|
| 12 |
+1; |
| ... | ... |
@@ -0,0 +1,13 @@ |
| 1 |
+package MyModel5::table1_2; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'MyModel5'; |
|
| 7 |
+ |
|
| 8 |
+__PACKAGE__->attr(name => 'table1_3'); |
|
| 9 |
+__PACKAGE__->attr(table => 'table1'); |
|
| 10 |
+ |
|
| 11 |
+__PACKAGE__->attr('primary_key' => sub { ['key1', 'key2'] });
|
|
| 12 |
+ |
|
| 13 |
+1; |