Intro updates regarding Schema::Loader usage and on_connect_do
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Manual / FAQ.pod
1 =head1 NAME
2
3 DBIx::Class::Manual::FAQ - Frequently Asked Questions (in theory)
4
5 =head1 DESCRIPTION
6
7 This document is intended as an anti-map of the documentation. If you
8 know what you want to do, but not how to do it in L<DBIx::Class>, then
9 look here. It does B<not> contain any code or examples, it just gives
10 explanations and pointers to the correct pieces of documentation to
11 read.
12
13 =head1 FAQs
14
15 How Do I:
16
17 =head2 Getting started
18
19 =over 4
20
21 =item .. create a database to use?
22
23 First, choose a database. For testing/experimenting, we reccommend
24 L<DBD::SQLite>, which is a self-contained small database. (i.e. all
25 you need to do is to install the DBD from CPAN, and it's usable).
26
27 Next, spend some time defining which data you need to store, and how
28 it relates to the other data you have. For some help on normalisation,
29 go to L<http://b62.tripod.com/doc/dbbase.htm> or
30 L<http://209.197.234.36/db/simple.html>.
31
32 Now, decide whether you want to have the database itself be the
33 definitive source of information about the data layout, or your
34 DBIx::Class schema. If it's the former, look up the documentation for
35 your database, eg. L<http://sqlite.org/lang_createtable.html>, on how
36 to create tables, and start creating them. For a nice universal
37 interface to your database, you can try L<DBI::Shell>. If you decided
38 on the latter choice, read the FAQ on setting up your classes
39 manually, and the one on creating tables from your schema.
40
41 =item .. use DBIx::Class with L<Catalyst>?
42
43 Install L<Catalyst::Model::DBIC::Schema> from CPAN. See it's
44 documentation, or below, for further details.
45
46 =item .. set up my DBIx::Class classes automatically from my database?
47
48 Install L<DBIx::Class::Schema::Loader> from CPAN, and read it's documentation. 
49
50 =item .. set up my DBIx::Class classes manually?
51
52 Look at the L<DBIx::Class::Manual::Example>, come back here if you get lost.
53
54 =item .. create my database tables from my DBIx::Class schema?
55
56 Create your classes manually, as above. Write a script that calls
57 L<DBIx::Class::Schema/deploy>. See there for details, or the
58 L<DBIx::Class::Manual::Cookbook>.
59
60 =item .. connect to my database?
61
62 Once you have created all the appropriate table/source classes, and an
63 overall L<DBIx::Class::Schema|"Schema"> class, you can start using
64 them in an application. To do this, you need to create a central
65 Schema object, which is used to access all the data in the various
66 tables. See L<DBIx::Class::Schema/connect> for details. The actual
67 connection does not happen until you actually request data, so don't
68 be alarmed if the error from incorrect connection details happens a
69 lot later.
70
71
72 =back 
73
74 =head2 Relationships
75
76 =over 4
77
78 =item .. tell DBIx::Class about relationships between my tables?
79
80 There are a vareity of relationship types that come pre-defined for you to use. These are all listed in L<DBIx::Class::Relationship>. If you need a non-standard type, or more information, look in L<DBIx::Class::Relationship::Base>.
81
82 =item .. define a one-to-many relationship?
83
84 This is called a C<has_many> relationship on the one side, and a C<belongs_to> relationship on the many side. Currently these need to be set up individually on each side. See L<DBIx::Class::Relationship> for details.
85
86 =item .. define a relationship where this table contains another table's primary key? (foreign key)
87
88 Create a C<belongs_to> relationship for the field containing the foreign key. L<DBIx::Class::Relationship/belongs_to>.
89
90 =item .. define a foreign key relationship where the key field may contain NULL?  
91
92 Just create a C<belongs_to> relationship, as above. If
93 the column is NULL then the inflation to the foreign object will not
94 happen. This has a side effect of not always fetching all the relevant
95 data, if you use a nullable foreign-key relationship in a JOIN, then
96 you probably want to set the join_type to 'left'.
97
98 =item .. define a relationship where the key consists of more than one column?
99
100 Instead of supplying a single column name, all relationship types also
101 allow you to supply a hashref containing the condition across which
102 the tables are to be joined. The condition may contain as many fields
103 as you like. See L<DBIx::Class::Relationship::Base>.
104
105 =item .. define a relatiopnship across an intermediate table? (many-to-many)
106
107 Read the documentation on L<DBIx::Class::Relationship/many_to_many>.
108
109 =item .. stop DBIx::Class from attempting to cascade deletes on my has_many relationships?
110
111 By default, DBIx::Class cascades deletes and updates across
112 C<has_many> relationships. If your database already does this (and
113 probably better), turn it off by supplying C<< cascade_delete => 0 >> in
114 the relationship attributes. See L<DBIx::Class::Relationship::Base>.
115
116 =item .. use a relationship?
117
118 Use it's name. An accessor is created using the name. See examples in L<DBIx::Class::Manual::Cookbook/Using relationships>.
119
120 =back
121
122 =head2 Searching
123
124 =over 4
125
126 =item .. search for data?
127
128 Create a C<$schema> object, as mentioned above in ".. connect to my
129 database". Find the
130 L<DBIx::Class::Manual::Glossary/ResultSet|"ResultSet"> that you want
131 to search in, and call C<search> on it. See
132 L<DBIx::Class::ResultSet/search>.
133
134 =item .. search using database functions?
135
136 Supplying something like:
137
138  ->search({'mydatefield' => 'now()'})
139
140 to search, will probably not do what you expect. It will quote the
141 text "now()", instead of trying to call the function. To provide
142 literal, unquoted text you need to pass in a scalar reference, like
143 so:
144
145  ->search({'mydatefield' => \'now()'})
146
147 =item .. sort the results of my search?
148
149 Supply a list of columns you want to sort by, to the C<order_by>
150 attribute, see L<DBIx::Class::ResultSet/order_by>.
151
152 =item .. sort my results based on fields I've aliased using C<as>?
153
154 You don't. You'll need to supply the same functions/expressions to
155 C<order_by>, as you did to C<select>.
156
157 =item .. group the results of my search?
158
159 Supply a list of columns you want to group on, to the C<group_by>
160 attribute, see L<DBIx::Class::ResultSet/group_by>.
161
162 =item .. group my results based on fields I've aliased using C<as>?
163
164 You don't. You'll need to supply the same functions/expressions to
165 C<group_by>, as you did to C<select>.
166
167 =item .. filter the results of my search?
168
169 =item .. search in several tables simultaneously?
170
171 =item .. create joins with conditions other than column equality?
172
173 =item .. search using greater-than or less-than and database functions?
174 NOT 
175  my $interval = "now() - interval '12 hours'";
176  last_attempt => { '<' => \$interval },
177 BUT
178 08:44 <@castaway> my $interval = "< now() - interval '12 hours'"; .. 
179                   last_attempt => \$interval ,
180
181
182 =item .. find more help on constructing searches?
183
184 Behind the scenes, DBIx::Class uses L<SQL::Abstract> to help construct
185 it's SQL searches. So if you fail to find help in the
186 L<DBIx::Class::Manual::Cookbook>, try looking in the SQL::Abstract
187 documentation.
188
189 =back
190
191 =head2 Fetching data
192
193 =over 4
194
195 =item .. fetch as much data as possible in as few select calls as possible? (prefetch)
196
197 See the prefetch examples in the L<DBIx::Class::Manual::Cookbook|"Cookbook">.
198
199 =back
200
201 =head2 Inserting and updating data
202
203 =over 4
204
205 =item .. insert many rows of data efficiently?
206
207 =item .. update a collection of rows at the same time?
208
209 =item .. use database functions when updating rows?
210
211 =item .. update a column using data from another column?
212
213 =back
214
215 =head2 Misc
216
217 =over 4
218
219 =item How do I store my own (non-db) data in my DBIx::Class objects?
220
221 =item How do I use DBIx::Class objects my TT templates?
222
223 =item See the SQL statements my code is producing?
224
225 =item Why didn't my search run any SQL?
226
227
228 =back