Disable _is_unique_query check in single() since it can't infer properly yet
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / Manual / FAQ.pod
CommitLineData
81791ac3 1=head1 NAME
2
3DBIx::Class::Manual::FAQ - Frequently Asked Questions (in theory)
4
5=head1 DESCRIPTION
6
7This document is intended as an anti-map of the documentation. If you
8know what you want to do, but not how to do it in L<DBIx::Class>, then
9look here. It does B<not> contain any code or examples, it just gives
10explanations and pointers to the correct pieces of documentation to
11read.
12
13=head1 FAQs
14
15How Do I:
16
17=head2 Getting started
18
19=over 4
20
21=item .. create a database to use?
22
23First, choose a database. For testing/experimenting, we reccommend
24L<DBD::SQLite>, which is a self-contained small database. (i.e. all
25you need to do is to install the DBD from CPAN, and it's usable).
26
27Next, spend some time defining which data you need to store, and how
28it relates to the other data you have. For some help on normalisation,
29go to L<http://b62.tripod.com/doc/dbbase.htm> or
30L<http://209.197.234.36/db/simple.html>.
31
32Now, decide whether you want to have the database itself be the
33definitive source of information about the data layout, or your
34DBIx::Class schema. If it's the former, look up the documentation for
35your database, eg. L<http://sqlite.org/lang_createtable.html>, on how
36to create tables, and start creating them. For a nice universal
37interface to your database, you can try L<DBI::Shell>. If you decided
38on the latter choice, read the FAQ on setting up your classes
39manually, and the one on creating tables from your schema.
40
41=item .. use DBIx::Class with L<Catalyst>?
42
43Install L<Catalyst::Model::DBIC::Schema> from CPAN. See it's
44documentation, or below, for further details.
45
46=item .. set up my DBIx::Class classes automatically from my database?
47
48Install L<DBIx::Class::Schema::Loader> from CPAN, and read it's documentation.
49
50=item .. set up my DBIx::Class classes manually?
51
52Look 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
56Create your classes manually, as above. Write a script that calls
57L<DBIx::Class::Schema/deploy>. See there for details, or the
58L<DBIx::Class::Manual::Cookbook>.
59
7f613f3a 60=item .. connect to my database?
61
62Once you have created all the appropriate table/source classes, and an
63overall L<DBIx::Class::Schema|"Schema"> class, you can start using
64them in an application. To do this, you need to create a central
65Schema object, which is used to access all the data in the various
66tables. See L<DBIx::Class::Schema/connect> for details. The actual
67connection does not happen until you actually request data, so don't
68be alarmed if the error from incorrect connection details happens a
69lot later.
70
71
81791ac3 72=back
73
74=head2 Relationships
75
76=over 4
77
78=item .. tell DBIx::Class about relationships between my tables?
79
80There 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
84This 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
88Create 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
92Just create a C<belongs_to> relationship, as above. If
93the column is NULL then the inflation to the foreign object will not
94happen. This has a side effect of not always fetching all the relevant
95data, if you use a nullable foreign-key relationship in a JOIN, then
96you 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
100Instead of supplying a single column name, all relationship types also
101allow you to supply a hashref containing the condition across which
102the tables are to be joined. The condition may contain as many fields
103as you like. See L<DBIx::Class::Relationship::Base>.
104
105=item .. define a relatiopnship across an intermediate table? (many-to-many)
106
107Read 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
111By default, DBIx::Class cascades deletes and updates across
112C<has_many> relationships. If your database already does this (and
113probably better), turn it off by supplying C<< cascade_delete => 0 >> in
114the relationship attributes. See L<DBIx::Class::Relationship::Base>.
115
116=item .. use a relationship?
117
118Use 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
7f613f3a 128Create a C<$schema> object, as mentioned above in ".. connect to my
129database". Find the
130L<DBIx::Class::Manual::Glossary/ResultSet|"ResultSet"> that you want
131to search in, and call C<search> on it. See
132L<DBIx::Class::ResultSet/search>.
133
81791ac3 134=item .. search using database functions?
135
7f613f3a 136Supplying something like:
137
138 ->search({'mydatefield' => 'now()'})
139
140to search, will probably not do what you expect. It will quote the
141text "now()", instead of trying to call the function. To provide
142literal, unquoted text you need to pass in a scalar reference, like
143so:
144
145 ->search({'mydatefield' => \'now()'})
146
81791ac3 147=item .. sort the results of my search?
148
7f613f3a 149Supply a list of columns you want to sort by, to the C<order_by>
150attribute, see L<DBIx::Class::ResultSet/order_by>.
151
152=item .. sort my results based on fields I've aliased using C<as>?
153
154You don't. You'll need to supply the same functions/expressions to
155C<order_by>, as you did to C<select>.
156
81791ac3 157=item .. group the results of my search?
158
7f613f3a 159Supply a list of columns you want to group on, to the C<group_by>
160attribute, see L<DBIx::Class::ResultSet/group_by>.
161
162=item .. group my results based on fields I've aliased using C<as>?
163
164You don't. You'll need to supply the same functions/expressions to
165C<group_by>, as you did to C<select>.
166
81791ac3 167=item .. filter the results of my search?
168
169=item .. search in several tables simultaneously?
170
7f613f3a 171=item .. create joins with conditions other than column equality?
172
173=item .. search using greater-than or less-than and database functions?
174NOT
175 my $interval = "now() - interval '12 hours'";
176 last_attempt => { '<' => \$interval },
177BUT
17808:44 <@castaway> my $interval = "< now() - interval '12 hours'"; ..
179 last_attempt => \$interval ,
180
181
81791ac3 182=item .. find more help on constructing searches?
183
184Behind the scenes, DBIx::Class uses L<SQL::Abstract> to help construct
185it's SQL searches. So if you fail to find help in the
186L<DBIx::Class::Manual::Cookbook>, try looking in the SQL::Abstract
187documentation.
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
197See the prefetch examples in the L<DBIx::Class::Manual::Cookbook|"Cookbook">.
198
199=back
200
81791ac3 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