Showing 9 changed files with 181 additions and 59 deletions
+3
Changes
... ...
@@ -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.
+14 -8
lib/DBIx/Custom.pm
... ...
@@ -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
 }
+59 -22
lib/DBIx/Custom/Guide.pod
... ...
@@ -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()>.
+61 -24
lib/DBIx/Custom/Guide/Ja.pod
... ...
@@ -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 -3
lib/DBIx/Custom/Model.pm
... ...
@@ -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;
+7 -1
t/dbix-custom-core-sqlite.t
... ...
@@ -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';
+1 -1
t/dbix-custom-core-sqlite/MyDBI1.pm
... ...
@@ -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
 }
+12
t/dbix-custom-core-sqlite/MyModel5/table1_1.pm
... ...
@@ -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;
+13
t/dbix-custom-core-sqlite/MyModel5/table1_2.pm
... ...
@@ -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;