blob: 5bfdfdb52bd35cb0c9eb34a3f2648720837442cc [file] [log] [blame]
Derek Jones8ede1a22011-10-05 13:34:52 -05001###################
Jamie Rumbelow7efad202012-02-19 12:37:00 +00002Query Builder Class
Derek Jones8ede1a22011-10-05 13:34:52 -05003###################
4
Jamie Rumbelow7efad202012-02-19 12:37:00 +00005CodeIgniter gives you access to a Query Builder class. This pattern
6allows information to be retrieved, inserted, and updated in your
7database with minimal scripting. In some cases only one or two lines
8of code are necessary to perform a database action.
Derek Jones8ede1a22011-10-05 13:34:52 -05009CodeIgniter does not require that each database table be its own class
10file. It instead provides a more simplified interface.
11
Jamie Rumbelow7efad202012-02-19 12:37:00 +000012Beyond simplicity, a major benefit to using the Query Builder features
Derek Jones8ede1a22011-10-05 13:34:52 -050013is that it allows you to create database independent applications, since
14the query syntax is generated by each database adapter. It also allows
15for safer queries, since the values are escaped automatically by the
16system.
17
18.. note:: If you intend to write your own queries you can disable this
19 class in your database config file, allowing the core database library
20 and adapter to utilize fewer resources.
21
22.. contents:: Page Contents
23
24**************
25Selecting Data
26**************
27
28The following functions allow you to build SQL **SELECT** statements.
29
30$this->db->get()
31================
32
33Runs the selection query and returns the result. Can be used by itself
34to retrieve all records from a table::
35
36 $query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable
37
38The second and third parameters enable you to set a limit and offset
39clause::
40
41 $query = $this->db->get('mytable', 10, 20);
42 // Produces: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
43
44You'll notice that the above function is assigned to a variable named
45$query, which can be used to show the results::
46
47 $query = $this->db->get('mytable');
WanWizard7219c072011-12-28 14:09:05 +010048
Derek Jones8ede1a22011-10-05 13:34:52 -050049 foreach ($query->result() as $row)
50 {
51 echo $row->title;
52 }
53
54Please visit the :doc:`result functions <results>` page for a full
55discussion regarding result generation.
56
Kyle Farris48d8fb62011-10-14 17:59:49 -030057$this->db->get_compiled_select()
58================================
59
WanWizard7219c072011-12-28 14:09:05 +010060Compiles the selection query just like `$this->db->get()`_ but does not *run*
Kyle Farris48d8fb62011-10-14 17:59:49 -030061the query. This method simply returns the SQL query as a string.
62
63Example::
64
65 $sql = $this->db->get_compiled_select('mytable');
66 echo $sql;
WanWizard7219c072011-12-28 14:09:05 +010067
Kyle Farris48d8fb62011-10-14 17:59:49 -030068 // Produces string: SELECT * FROM mytable
WanWizard7219c072011-12-28 14:09:05 +010069
Jamie Rumbelow7efad202012-02-19 12:37:00 +000070The second parameter enables you to set whether or not the query builder query
GDmac01e9fb12013-11-09 08:01:52 +010071will be reset (by default it will be reset, just like when using `$this->db->get()`)::
Kyle Farris48d8fb62011-10-14 17:59:49 -030072
73 echo $this->db->limit(10,20)->get_compiled_select('mytable', FALSE);
WanWizard7219c072011-12-28 14:09:05 +010074 // Produces string: SELECT * FROM mytable LIMIT 20, 10
Kyle Farris48d8fb62011-10-14 17:59:49 -030075 // (in MySQL. Other databases have slightly different syntax)
WanWizard7219c072011-12-28 14:09:05 +010076
Kyle Farris48d8fb62011-10-14 17:59:49 -030077 echo $this->db->select('title, content, date')->get_compiled_select();
78
GDmac01e9fb12013-11-09 08:01:52 +010079 // Produces string: SELECT title, content, date FROM mytable LIMIT 20, 10
WanWizard7219c072011-12-28 14:09:05 +010080
81The key thing to notice in the above example is that the second query did not
82utilize `$this->db->from()`_ and did not pass a table name into the first
83parameter. The reason for this outcome is because the query has not been
84executed using `$this->db->get()`_ which resets values or reset directly
Greg Akerffd24a42011-12-25 22:27:59 -060085using `$this->db->reset_query()`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -030086
Derek Jones84bcc6e2011-10-17 21:24:27 -050087
Derek Jones8ede1a22011-10-05 13:34:52 -050088$this->db->get_where()
89======================
90
91Identical to the above function except that it permits you to add a
92"where" clause in the second parameter, instead of using the db->where()
93function::
94
95 $query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
96
97Please read the about the where function below for more information.
98
Greg Akerffd24a42011-12-25 22:27:59 -060099.. note:: get_where() was formerly known as getwhere(), which has been removed
Derek Jones8ede1a22011-10-05 13:34:52 -0500100
101$this->db->select()
102===================
103
104Permits you to write the SELECT portion of your query::
105
106 $this->db->select('title, content, date');
107 $query = $this->db->get('mytable'); // Produces: SELECT title, content, date FROM mytable
108
109
110.. note:: If you are selecting all (\*) from a table you do not need to
111 use this function. When omitted, CodeIgniter assumes you wish to SELECT *
112
113$this->db->select() accepts an optional second parameter. If you set it
114to FALSE, CodeIgniter will not try to protect your field or table names
115with backticks. This is useful if you need a compound select statement.
116
117::
118
WanWizard7219c072011-12-28 14:09:05 +0100119 $this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
Derek Jones8ede1a22011-10-05 13:34:52 -0500120 $query = $this->db->get('mytable');
121
122
123$this->db->select_max()
124=======================
125
126Writes a "SELECT MAX(field)" portion for your query. You can optionally
127include a second parameter to rename the resulting field.
128
129::
130
131 $this->db->select_max('age');
132 $query = $this->db->get('members'); // Produces: SELECT MAX(age) as age FROM members
WanWizard7219c072011-12-28 14:09:05 +0100133
Derek Jones8ede1a22011-10-05 13:34:52 -0500134 $this->db->select_max('age', 'member_age');
135 $query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
136
137
138$this->db->select_min()
139=======================
140
141Writes a "SELECT MIN(field)" portion for your query. As with
142select_max(), You can optionally include a second parameter to rename
143the resulting field.
144
145::
146
147 $this->db->select_min('age');
148 $query = $this->db->get('members'); // Produces: SELECT MIN(age) as age FROM members
149
150
151$this->db->select_avg()
152=======================
153
154Writes a "SELECT AVG(field)" portion for your query. As with
155select_max(), You can optionally include a second parameter to rename
156the resulting field.
157
158::
159
160 $this->db->select_avg('age');
161 $query = $this->db->get('members'); // Produces: SELECT AVG(age) as age FROM members
162
163
164$this->db->select_sum()
165=======================
166
167Writes a "SELECT SUM(field)" portion for your query. As with
168select_max(), You can optionally include a second parameter to rename
169the resulting field.
170
171::
172
173 $this->db->select_sum('age');
174 $query = $this->db->get('members'); // Produces: SELECT SUM(age) as age FROM members
175
176
177$this->db->from()
178=================
179
180Permits you to write the FROM portion of your query::
181
182 $this->db->select('title, content, date');
183 $this->db->from('mytable');
184 $query = $this->db->get(); // Produces: SELECT title, content, date FROM mytable
185
186.. note:: As shown earlier, the FROM portion of your query can be specified
187 in the $this->db->get() function, so use whichever method you prefer.
188
189$this->db->join()
190=================
191
192Permits you to write the JOIN portion of your query::
193
194 $this->db->select('*');
195 $this->db->from('blogs');
196 $this->db->join('comments', 'comments.id = blogs.id');
197 $query = $this->db->get();
WanWizard7219c072011-12-28 14:09:05 +0100198
Derek Jones8ede1a22011-10-05 13:34:52 -0500199 // Produces:
kenjisc35d2c92011-10-26 17:09:17 +0900200 // SELECT * FROM blogs JOIN comments ON comments.id = blogs.id
Derek Jones8ede1a22011-10-05 13:34:52 -0500201
202Multiple function calls can be made if you need several joins in one
203query.
204
205If you need a specific type of JOIN you can specify it via the third
206parameter of the function. Options are: left, right, outer, inner, left
207outer, and right outer.
208
209::
210
211 $this->db->join('comments', 'comments.id = blogs.id', 'left');
212 // Produces: LEFT JOIN comments ON comments.id = blogs.id
213
214$this->db->where()
215==================
216
217This function enables you to set **WHERE** clauses using one of four
218methods:
219
220.. note:: All values passed to this function are escaped automatically,
221 producing safer queries.
222
223#. **Simple key/value method:**
224
225 ::
226
WanWizard7219c072011-12-28 14:09:05 +0100227 $this->db->where('name', $name); // Produces: WHERE name = 'Joe'
Derek Jones8ede1a22011-10-05 13:34:52 -0500228
229 Notice that the equal sign is added for you.
230
231 If you use multiple function calls they will be chained together with
232 AND between them:
233
234 ::
235
236 $this->db->where('name', $name);
237 $this->db->where('title', $title);
238 $this->db->where('status', $status);
WanWizard7219c072011-12-28 14:09:05 +0100239 // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
Derek Jones8ede1a22011-10-05 13:34:52 -0500240
241#. **Custom key/value method:**
242 You can include an operator in the first parameter in order to
243 control the comparison:
244
245 ::
246
247 $this->db->where('name !=', $name);
WanWizard7219c072011-12-28 14:09:05 +0100248 $this->db->where('id <', $id); // Produces: WHERE name != 'Joe' AND id < 45
Derek Jones8ede1a22011-10-05 13:34:52 -0500249
250#. **Associative array method:**
251
252 ::
253
254 $array = array('name' => $name, 'title' => $title, 'status' => $status);
255 $this->db->where($array);
WanWizard7219c072011-12-28 14:09:05 +0100256 // Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
Derek Jones8ede1a22011-10-05 13:34:52 -0500257
258 You can include your own operators using this method as well:
259
260 ::
261
262 $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
263 $this->db->where($array);
264
265#. **Custom string:**
266 You can write your own clauses manually::
267
268 $where = "name='Joe' AND status='boss' OR status='active'";
269 $this->db->where($where);
270
271
272$this->db->where() accepts an optional third parameter. If you set it to
273FALSE, CodeIgniter will not try to protect your field or table names
274with backticks.
275
276::
277
278 $this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);
279
280
281$this->db->or_where()
282=====================
283
284This function is identical to the one above, except that multiple
285instances are joined by OR::
286
287 $this->db->where('name !=', $name);
288 $this->db->or_where('id >', $id); // Produces: WHERE name != 'Joe' OR id > 50
289
290.. note:: or_where() was formerly known as orwhere(), which has been
291 removed.
292
293$this->db->where_in()
294=====================
295
296Generates a WHERE field IN ('item', 'item') SQL query joined with AND if
297appropriate
298
299::
300
301 $names = array('Frank', 'Todd', 'James');
302 $this->db->where_in('username', $names);
303 // Produces: WHERE username IN ('Frank', 'Todd', 'James')
304
305
306$this->db->or_where_in()
307========================
308
309Generates a WHERE field IN ('item', 'item') SQL query joined with OR if
310appropriate
311
312::
313
314 $names = array('Frank', 'Todd', 'James');
315 $this->db->or_where_in('username', $names);
316 // Produces: OR username IN ('Frank', 'Todd', 'James')
317
318
319$this->db->where_not_in()
320=========================
321
322Generates a WHERE field NOT IN ('item', 'item') SQL query joined with
323AND if appropriate
324
325::
326
327 $names = array('Frank', 'Todd', 'James');
328 $this->db->where_not_in('username', $names);
329 // Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')
330
331
332$this->db->or_where_not_in()
333============================
334
335Generates a WHERE field NOT IN ('item', 'item') SQL query joined with OR
336if appropriate
337
338::
339
340 $names = array('Frank', 'Todd', 'James');
341 $this->db->or_where_not_in('username', $names);
342 // Produces: OR username NOT IN ('Frank', 'Todd', 'James')
343
344
345$this->db->like()
346=================
347
Andrey Andreev41738232012-11-30 00:13:17 +0200348This method enables you to generate **LIKE** clauses, useful for doing
Derek Jones8ede1a22011-10-05 13:34:52 -0500349searches.
350
Andrey Andreev41738232012-11-30 00:13:17 +0200351.. note:: All values passed to this method are escaped automatically.
Derek Jones8ede1a22011-10-05 13:34:52 -0500352
353#. **Simple key/value method:**
354
355 ::
356
Andrey Andreev41738232012-11-30 00:13:17 +0200357 $this->db->like('title', 'match');
358 // Produces: WHERE `title` LIKE '%match%' ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500359
Andrey Andreev41738232012-11-30 00:13:17 +0200360 If you use multiple method calls they will be chained together with
Derek Jones8ede1a22011-10-05 13:34:52 -0500361 AND between them::
362
363 $this->db->like('title', 'match');
364 $this->db->like('body', 'match');
Andrey Andreev41738232012-11-30 00:13:17 +0200365 // WHERE `title` LIKE '%match%' ESCAPE '!' AND `body` LIKE '%match% ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500366
367 If you want to control where the wildcard (%) is placed, you can use
368 an optional third argument. Your options are 'before', 'after' and
369 'both' (which is the default).
370
371 ::
372
Andrey Andreev41738232012-11-30 00:13:17 +0200373 $this->db->like('title', 'match', 'before'); // Produces: WHERE `title` LIKE '%match' ESCAPE '!'
374 $this->db->like('title', 'match', 'after'); // Produces: WHERE `title` LIKE 'match%' ESCAPE '!'
375 $this->db->like('title', 'match', 'both'); // Produces: WHERE `title` LIKE '%match%' ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500376
377#. **Associative array method:**
378
379 ::
380
381 $array = array('title' => $match, 'page1' => $match, 'page2' => $match);
382 $this->db->like($array);
Andrey Andreev41738232012-11-30 00:13:17 +0200383 // WHERE `title` LIKE '%match%' ESCAPE '!' AND `page1` LIKE '%match%' ESCAPE '!' AND `page2` LIKE '%match%' ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500384
385
386$this->db->or_like()
387====================
388
Andrey Andreev41738232012-11-30 00:13:17 +0200389This method is identical to the one above, except that multiple
Derek Jones8ede1a22011-10-05 13:34:52 -0500390instances are joined by OR::
391
392 $this->db->like('title', 'match'); $this->db->or_like('body', $match);
Andrey Andreev41738232012-11-30 00:13:17 +0200393 // WHERE `title` LIKE '%match%' ESCAPE '!' OR `body` LIKE '%match%' ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500394
Andrey Andreev41738232012-11-30 00:13:17 +0200395.. note:: ``or_like()`` was formerly known as ``orlike()``, which has been removed.
Derek Jones8ede1a22011-10-05 13:34:52 -0500396
397$this->db->not_like()
398=====================
399
Andrey Andreev41738232012-11-30 00:13:17 +0200400This method is identical to ``like()``, except that it generates
401NOT LIKE statements::
Derek Jones8ede1a22011-10-05 13:34:52 -0500402
Andrey Andreev41738232012-11-30 00:13:17 +0200403 $this->db->not_like('title', 'match'); // WHERE `title` NOT LIKE '%match% ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500404
405$this->db->or_not_like()
406========================
407
Andrey Andreev41738232012-11-30 00:13:17 +0200408This method is identical to ``not_like()``, except that multiple
Derek Jones8ede1a22011-10-05 13:34:52 -0500409instances are joined by OR::
410
411 $this->db->like('title', 'match');
412 $this->db->or_not_like('body', 'match');
Andrey Andreev41738232012-11-30 00:13:17 +0200413 // WHERE `title` LIKE '%match% OR `body` NOT LIKE '%match%' ESCAPE '!'
Derek Jones8ede1a22011-10-05 13:34:52 -0500414
415$this->db->group_by()
416=====================
417
418Permits you to write the GROUP BY portion of your query::
419
420 $this->db->group_by("title"); // Produces: GROUP BY title
421
422You can also pass an array of multiple values as well::
423
424 $this->db->group_by(array("title", "date")); // Produces: GROUP BY title, date
425
426.. note:: group_by() was formerly known as groupby(), which has been
427 removed.
428
429$this->db->distinct()
430=====================
431
432Adds the "DISTINCT" keyword to a query
433
434::
435
436 $this->db->distinct();
437 $this->db->get('table'); // Produces: SELECT DISTINCT * FROM table
438
439
440$this->db->having()
441===================
442
443Permits you to write the HAVING portion of your query. There are 2
444possible syntaxes, 1 argument or 2::
445
446 $this->db->having('user_id = 45'); // Produces: HAVING user_id = 45
WanWizard7219c072011-12-28 14:09:05 +0100447 $this->db->having('user_id', 45); // Produces: HAVING user_id = 45
Derek Jones8ede1a22011-10-05 13:34:52 -0500448
449You can also pass an array of multiple values as well::
450
451 $this->db->having(array('title =' => 'My Title', 'id <' => $id));
452 // Produces: HAVING title = 'My Title', id < 45
453
454
455If you are using a database that CodeIgniter escapes queries for, you
456can prevent escaping content by passing an optional third argument, and
457setting it to FALSE.
458
459::
460
461 $this->db->having('user_id', 45); // Produces: HAVING `user_id` = 45 in some databases such as MySQL
462 $this->db->having('user_id', 45, FALSE); // Produces: HAVING user_id = 45
463
464
465$this->db->or_having()
466======================
467
468Identical to having(), only separates multiple clauses with "OR".
469
470$this->db->order_by()
471=====================
472
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200473Lets you set an ORDER BY clause.
474
475The first parameter contains the name of the column you would like to order by.
476
477The second parameter lets you set the direction of the result.
478Options are **ASC**, **DESC** AND **RANDOM**.
Derek Jones8ede1a22011-10-05 13:34:52 -0500479
480::
481
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200482 $this->db->order_by('title', 'DESC');
483 // Produces: ORDER BY `title` DESC
Derek Jones8ede1a22011-10-05 13:34:52 -0500484
485You can also pass your own string in the first parameter::
486
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200487 $this->db->order_by('title DESC, name ASC');
488 // Produces: ORDER BY `title` DESC, `name` ASC
Derek Jones8ede1a22011-10-05 13:34:52 -0500489
490Or multiple function calls can be made if you need multiple fields.
491
492::
493
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200494 $this->db->order_by('title', 'DESC');
495 $this->db->order_by('name', 'ASC');
496 // Produces: ORDER BY `title` DESC, `name` ASC
Derek Jones8ede1a22011-10-05 13:34:52 -0500497
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200498If you choose the **RANDOM** direction option, then the first parameters will
499be ignored, unless you specify a numeric seed value.
500
501::
502
503 $this->db->order_by('title', 'RANDOM');
504 // Produces: ORDER BY RAND()
505
506 $this->db->order_by(42, 'RANDOM');
507 // Produces: ORDER BY RAND(42)
Derek Jones8ede1a22011-10-05 13:34:52 -0500508
509.. note:: order_by() was formerly known as orderby(), which has been
510 removed.
511
Andrey Andreev0dfb62f2012-10-30 11:37:15 +0200512.. note:: Random ordering is not currently supported in Oracle and
513 will default to ASC instead.
Derek Jones8ede1a22011-10-05 13:34:52 -0500514
515$this->db->limit()
516==================
517
518Lets you limit the number of rows you would like returned by the query::
519
520 $this->db->limit(10); // Produces: LIMIT 10
521
522The second parameter lets you set a result offset.
523
524::
525
526 $this->db->limit(10, 20); // Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
527
528$this->db->count_all_results()
529==============================
530
531Permits you to determine the number of rows in a particular Active
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000532Record query. Queries will accept Query Builder restrictors such as
Derek Jones8ede1a22011-10-05 13:34:52 -0500533where(), or_where(), like(), or_like(), etc. Example::
534
535 echo $this->db->count_all_results('my_table'); // Produces an integer, like 25
536 $this->db->like('title', 'match');
537 $this->db->from('my_table');
WanWizard7219c072011-12-28 14:09:05 +0100538 echo $this->db->count_all_results(); // Produces an integer, like 17
Derek Jones8ede1a22011-10-05 13:34:52 -0500539
540$this->db->count_all()
541======================
542
543Permits you to determine the number of rows in a particular table.
544Submit the table name in the first parameter. Example::
545
546 echo $this->db->count_all('my_table'); // Produces an integer, like 25
547
548**************
WanWizard7219c072011-12-28 14:09:05 +0100549Query grouping
550**************
551
552Query grouping allows you to create groups of WHERE clauses by enclosing them in parentheses. This will allow
Timothy Warrene464b392012-03-13 14:09:31 -0400553you to create queries with complex WHERE clauses. Nested groups are supported. Example::
WanWizard7219c072011-12-28 14:09:05 +0100554
555 $this->db->select('*')->from('my_table')
556 ->group_start()
557 ->where('a', 'a')
558 ->or_group_start()
559 ->where('b', 'b')
560 ->where('c', 'c')
561 ->group_end()
562 ->group_end()
563 ->where('d', 'd')
564 ->get();
565
566 // Generates:
567 // SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
568
569.. note:: groups need to be balanced, make sure every group_start() is matched by a group_end().
570
571$this->db->group_start()
572========================
573
574Starts a new group by adding an opening parenthesis to the WHERE clause of the query.
575
576$this->db->or_group_start()
577===========================
578
579Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR'.
580
581$this->db->not_group_start()
582============================
583
584Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'NOT'.
585
586$this->db->or_not_group_start()
587===============================
588
589Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR NOT'.
590
591$this->db->group_end()
592======================
593
594Ends the current group by adding an closing parenthesis to the WHERE clause of the query.
595
596**************
Derek Jones8ede1a22011-10-05 13:34:52 -0500597Inserting Data
598**************
599
600$this->db->insert()
601===================
602
603Generates an insert string based on the data you supply, and runs the
604query. You can either pass an **array** or an **object** to the
605function. Here is an example using an array::
606
607 $data = array(
608 'title' => 'My title',
609 'name' => 'My Name',
610 'date' => 'My date'
611 );
WanWizard7219c072011-12-28 14:09:05 +0100612
Derek Jones8ede1a22011-10-05 13:34:52 -0500613 $this->db->insert('mytable', $data);
614 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
615
616The first parameter will contain the table name, the second is an
617associative array of values.
618
619Here is an example using an object::
620
621 /*
622 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200623 public $title = 'My Title';
624 public $content = 'My Content';
625 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500626 }
627 */
WanWizard7219c072011-12-28 14:09:05 +0100628
Derek Jones8ede1a22011-10-05 13:34:52 -0500629 $object = new Myclass;
630 $this->db->insert('mytable', $object);
631 // Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
632
633The first parameter will contain the table name, the second is an
634object.
635
636.. note:: All values are escaped automatically producing safer queries.
637
Kyle Farris48d8fb62011-10-14 17:59:49 -0300638$this->db->get_compiled_insert()
639================================
WanWizard7219c072011-12-28 14:09:05 +0100640Compiles the insertion query just like `$this->db->insert()`_ but does not
Kyle Farris48d8fb62011-10-14 17:59:49 -0300641*run* the query. This method simply returns the SQL query as a string.
642
643Example::
644
645 $data = array(
646 'title' => 'My title',
647 'name' => 'My Name',
648 'date' => 'My date'
649 );
WanWizard7219c072011-12-28 14:09:05 +0100650
Kyle Farris48d8fb62011-10-14 17:59:49 -0300651 $sql = $this->db->set($data)->get_compiled_insert('mytable');
652 echo $sql;
WanWizard7219c072011-12-28 14:09:05 +0100653
Kyle Farris48d8fb62011-10-14 17:59:49 -0300654 // Produces string: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
655
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000656The second parameter enables you to set whether or not the query builder query
Kyle Farris48d8fb62011-10-14 17:59:49 -0300657will be reset (by default it will be--just like `$this->db->insert()`_)::
WanWizard7219c072011-12-28 14:09:05 +0100658
Kyle Farris48d8fb62011-10-14 17:59:49 -0300659 echo $this->db->set('title', 'My Title')->get_compiled_insert('mytable', FALSE);
WanWizard7219c072011-12-28 14:09:05 +0100660
Kyle Farris48d8fb62011-10-14 17:59:49 -0300661 // Produces string: INSERT INTO mytable (title) VALUES ('My Title')
WanWizard7219c072011-12-28 14:09:05 +0100662
Kyle Farris48d8fb62011-10-14 17:59:49 -0300663 echo $this->db->set('content', 'My Content')->get_compiled_insert();
664
665 // Produces string: INSERT INTO mytable (title, content) VALUES ('My Title', 'My Content')
WanWizard7219c072011-12-28 14:09:05 +0100666
667The key thing to notice in the above example is that the second query did not
Andrey Andreev6bdfa422013-12-19 15:36:01 +0200668utlize `$this->db->from()` nor did it pass a table name into the first
WanWizard7219c072011-12-28 14:09:05 +0100669parameter. The reason this worked is because the query has not been executed
Andrey Andreev6bdfa422013-12-19 15:36:01 +0200670using `$this->db->insert()` which resets values or reset directly using
671`$this->db->reset_query()`.
672
673.. note:: This method doesn't work for batched inserts.
Kyle Farris48d8fb62011-10-14 17:59:49 -0300674
Derek Jones8ede1a22011-10-05 13:34:52 -0500675$this->db->insert_batch()
676=========================
677
678Generates an insert string based on the data you supply, and runs the
679query. You can either pass an **array** or an **object** to the
680function. Here is an example using an array::
681
682 $data = array(
683 array(
684 'title' => 'My title',
685 'name' => 'My Name',
686 'date' => 'My date'
687 ),
688 array(
689 'title' => 'Another title',
690 'name' => 'Another Name',
691 'date' => 'Another date'
692 )
693 );
WanWizard7219c072011-12-28 14:09:05 +0100694
Derek Jones8ede1a22011-10-05 13:34:52 -0500695 $this->db->insert_batch('mytable', $data);
696 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
697
698The first parameter will contain the table name, the second is an
699associative array of values.
700
701.. note:: All values are escaped automatically producing safer queries.
702
Andrey Andreev04c50f52012-10-24 23:05:25 +0300703$this->db->replace()
704====================
705
706This method executes a REPLACE statement, which is basically the SQL
707standard for (optional) DELETE + INSERT, using *PRIMARY* and *UNIQUE*
708keys as the determining factor.
709In our case, it will save you from the need to implement complex
710logics with different combinations of ``select()``, ``update()``,
711``delete()`` and ``insert()`` calls.
712
713Example::
714
715 $data = array(
716 'title' => 'My title',
717 'name' => 'My Name',
718 'date' => 'My date'
719 );
720
721 $this->db->replace('table', $data);
722
723 // Executes: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
724
725In the above example, if we assume that the *title* field is our primary
726key, then if a row containing 'My title' as the *title* value, that row
727will be deleted with our new row data replacing it.
728
729Usage of the ``set()`` method is also allowed and all fields are
730automatically escaped, just like with ``insert()``.
731
Derek Jones8ede1a22011-10-05 13:34:52 -0500732$this->db->set()
733================
734
735This function enables you to set values for inserts or updates.
736
737**It can be used instead of passing a data array directly to the insert
738or update functions:**
739
740::
741
742 $this->db->set('name', $name);
743 $this->db->insert('mytable'); // Produces: INSERT INTO mytable (name) VALUES ('{$name}')
744
745If you use multiple function called they will be assembled properly
746based on whether you are doing an insert or an update::
747
748 $this->db->set('name', $name);
749 $this->db->set('title', $title);
750 $this->db->set('status', $status);
WanWizard7219c072011-12-28 14:09:05 +0100751 $this->db->insert('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500752
753**set()** will also accept an optional third parameter ($escape), that
754will prevent data from being escaped if set to FALSE. To illustrate the
755difference, here is set() used both with and without the escape
756parameter.
757
758::
759
760 $this->db->set('field', 'field+1', FALSE);
761 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES (field+1)
762 $this->db->set('field', 'field+1');
763 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES ('field+1')
764
765
766You can also pass an associative array to this function::
767
768 $array = array(
769 'name' => $name,
770 'title' => $title,
771 'status' => $status
772 );
WanWizard7219c072011-12-28 14:09:05 +0100773
Derek Jones8ede1a22011-10-05 13:34:52 -0500774 $this->db->set($array);
775 $this->db->insert('mytable');
776
777Or an object::
778
779 /*
780 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200781 public $title = 'My Title';
782 public $content = 'My Content';
783 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500784 }
785 */
WanWizard7219c072011-12-28 14:09:05 +0100786
Derek Jones8ede1a22011-10-05 13:34:52 -0500787 $object = new Myclass;
788 $this->db->set($object);
789 $this->db->insert('mytable');
790
Derek Jones8ede1a22011-10-05 13:34:52 -0500791*************
792Updating Data
793*************
794
795$this->db->update()
796===================
797
798Generates an update string and runs the query based on the data you
799supply. You can pass an **array** or an **object** to the function. Here
800is an example using an array::
801
802 $data = array(
803 'title' => $title,
804 'name' => $name,
805 'date' => $date
806 );
WanWizard7219c072011-12-28 14:09:05 +0100807
Derek Jones8ede1a22011-10-05 13:34:52 -0500808 $this->db->where('id', $id);
809 $this->db->update('mytable', $data);
810 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
811
812Or you can supply an object::
813
814 /*
815 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200816 public $title = 'My Title';
817 public $content = 'My Content';
818 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500819 }
820 */
WanWizard7219c072011-12-28 14:09:05 +0100821
Derek Jones8ede1a22011-10-05 13:34:52 -0500822 $object = new Myclass;
823 $this->db->where('id', $id);
824 $this->db->update('mytable', $object);
825 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
826
827.. note:: All values are escaped automatically producing safer queries.
828
829You'll notice the use of the $this->db->where() function, enabling you
830to set the WHERE clause. You can optionally pass this information
831directly into the update function as a string::
832
833 $this->db->update('mytable', $data, "id = 4");
834
835Or as an array::
836
837 $this->db->update('mytable', $data, array('id' => $id));
838
839You may also use the $this->db->set() function described above when
840performing updates.
841
Andrey Andreev04c50f52012-10-24 23:05:25 +0300842
Derek Jones8ede1a22011-10-05 13:34:52 -0500843$this->db->update_batch()
844=========================
845
846Generates an update string based on the data you supply, and runs the query.
847You can either pass an **array** or an **object** to the function.
848Here is an example using an array::
849
850 $data = array(
851 array(
852 'title' => 'My title' ,
853 'name' => 'My Name 2' ,
854 'date' => 'My date 2'
855 ),
856 array(
857 'title' => 'Another title' ,
858 'name' => 'Another Name 2' ,
859 'date' => 'Another date 2'
860 )
861 );
862
WanWizard7219c072011-12-28 14:09:05 +0100863 $this->db->update_batch('mytable', $data, 'title');
Derek Jones8ede1a22011-10-05 13:34:52 -0500864
WanWizard7219c072011-12-28 14:09:05 +0100865 // Produces:
Derek Jones8ede1a22011-10-05 13:34:52 -0500866 // UPDATE `mytable` SET `name` = CASE
867 // WHEN `title` = 'My title' THEN 'My Name 2'
868 // WHEN `title` = 'Another title' THEN 'Another Name 2'
869 // ELSE `name` END,
WanWizard7219c072011-12-28 14:09:05 +0100870 // `date` = CASE
Derek Jones8ede1a22011-10-05 13:34:52 -0500871 // WHEN `title` = 'My title' THEN 'My date 2'
872 // WHEN `title` = 'Another title' THEN 'Another date 2'
873 // ELSE `date` END
874 // WHERE `title` IN ('My title','Another title')
875
876The first parameter will contain the table name, the second is an associative
877array of values, the third parameter is the where key.
878
879.. note:: All values are escaped automatically producing safer queries.
880
Andrey Andreev9f808b02012-10-24 17:38:48 +0300881.. note:: ``affected_rows()`` won't give you proper results with this method,
882 due to the very nature of how it works. Instead, ``update_batch()``
883 returns the number of rows affected.
884
Kyle Farris48d8fb62011-10-14 17:59:49 -0300885$this->db->get_compiled_update()
886================================
887
888This works exactly the same way as ``$this->db->get_compiled_insert()`` except
889that it produces an UPDATE SQL string instead of an INSERT SQL string.
890
Andrey Andreev6bdfa422013-12-19 15:36:01 +0200891For more information view documentation for `$this->db->get_compiled_insert()`.
Kyle Farris48d8fb62011-10-14 17:59:49 -0300892
Andrey Andreev6bdfa422013-12-19 15:36:01 +0200893.. note:: This method doesn't work for batched updates.
Derek Jones8ede1a22011-10-05 13:34:52 -0500894
895*************
896Deleting Data
897*************
898
899$this->db->delete()
900===================
901
902Generates a delete SQL string and runs the query.
903
904::
905
906 $this->db->delete('mytable', array('id' => $id)); // Produces: // DELETE FROM mytable // WHERE id = $id
907
908The first parameter is the table name, the second is the where clause.
909You can also use the where() or or_where() functions instead of passing
910the data to the second parameter of the function::
911
912 $this->db->where('id', $id);
913 $this->db->delete('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100914
Derek Jones8ede1a22011-10-05 13:34:52 -0500915 // Produces:
916 // DELETE FROM mytable
917 // WHERE id = $id
918
919
920An array of table names can be passed into delete() if you would like to
921delete data from more than 1 table.
922
923::
924
925 $tables = array('table1', 'table2', 'table3');
926 $this->db->where('id', '5');
927 $this->db->delete($tables);
928
929
930If you want to delete all data from a table, you can use the truncate()
931function, or empty_table().
932
933$this->db->empty_table()
934========================
935
936Generates a delete SQL string and runs the
937query.::
938
kenjisc35d2c92011-10-26 17:09:17 +0900939 $this->db->empty_table('mytable'); // Produces: DELETE FROM mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500940
941
942$this->db->truncate()
943=====================
944
945Generates a truncate SQL string and runs the query.
946
947::
948
949 $this->db->from('mytable');
kenjisc35d2c92011-10-26 17:09:17 +0900950 $this->db->truncate();
WanWizard7219c072011-12-28 14:09:05 +0100951
952 // or
953
Derek Jones8ede1a22011-10-05 13:34:52 -0500954 $this->db->truncate('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100955
Derek Jones8ede1a22011-10-05 13:34:52 -0500956 // Produce:
WanWizard7219c072011-12-28 14:09:05 +0100957 // TRUNCATE mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500958
959.. note:: If the TRUNCATE command isn't available, truncate() will
960 execute as "DELETE FROM table".
WanWizard7219c072011-12-28 14:09:05 +0100961
Kyle Farris48d8fb62011-10-14 17:59:49 -0300962$this->db->get_compiled_delete()
963================================
964This works exactly the same way as ``$this->db->get_compiled_insert()`` except
965that it produces a DELETE SQL string instead of an INSERT SQL string.
966
Greg Akerffd24a42011-12-25 22:27:59 -0600967For more information view documentation for `$this->db->get_compiled_insert()`_.
Derek Jones8ede1a22011-10-05 13:34:52 -0500968
969***************
970Method Chaining
971***************
972
973Method chaining allows you to simplify your syntax by connecting
974multiple functions. Consider this example::
975
976 $query = $this->db->select('title')
Timothy Warrene464b392012-03-13 14:09:31 -0400977 ->where('id', $id)
978 ->limit(10, 20)
979 ->get('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500980
Derek Jones8ede1a22011-10-05 13:34:52 -0500981.. _ar-caching:
982
983*********************
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000984Query Builder Caching
Derek Jones8ede1a22011-10-05 13:34:52 -0500985*********************
986
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000987While not "true" caching, Query Builder enables you to save (or "cache")
Derek Jones8ede1a22011-10-05 13:34:52 -0500988certain parts of your queries for reuse at a later point in your
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000989script's execution. Normally, when an Query Builder call is completed,
Derek Jones8ede1a22011-10-05 13:34:52 -0500990all stored information is reset for the next call. With caching, you can
991prevent this reset, and reuse information easily.
992
993Cached calls are cumulative. If you make 2 cached select() calls, and
994then 2 uncached select() calls, this will result in 4 select() calls.
995There are three Caching functions available:
996
997$this->db->start_cache()
998========================
999
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001000This function must be called to begin caching. All Query Builder queries
Derek Jones8ede1a22011-10-05 13:34:52 -05001001of the correct type (see below for supported queries) are stored for
1002later use.
1003
1004$this->db->stop_cache()
1005=======================
1006
1007This function can be called to stop caching.
1008
1009$this->db->flush_cache()
1010========================
1011
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001012This function deletes all items from the Query Builder cache.
Derek Jones8ede1a22011-10-05 13:34:52 -05001013
1014Here's a usage example::
1015
1016 $this->db->start_cache();
1017 $this->db->select('field1');
1018 $this->db->stop_cache();
1019 $this->db->get('tablename');
1020 //Generates: SELECT `field1` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001021
Derek Jones8ede1a22011-10-05 13:34:52 -05001022 $this->db->select('field2');
1023 $this->db->get('tablename');
1024 //Generates: SELECT `field1`, `field2` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001025
Derek Jones8ede1a22011-10-05 13:34:52 -05001026 $this->db->flush_cache();
1027 $this->db->select('field2');
1028 $this->db->get('tablename');
1029 //Generates: SELECT `field2` FROM (`tablename`)
1030
1031
1032.. note:: The following statements can be cached: select, from, join,
1033 where, like, group_by, having, order_by, set
1034
1035
Greg Akerffd24a42011-12-25 22:27:59 -06001036$this->db->reset_query()
1037========================
Kyle Farris48d8fb62011-10-14 17:59:49 -03001038
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001039Resetting Query Builder allows you to start fresh with your query without
WanWizard7219c072011-12-28 14:09:05 +01001040executing it first using a method like $this->db->get() or $this->db->insert().
1041Just like the methods that execute a query, this will *not* reset items you've
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001042cached using `Query Builder Caching`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -03001043
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001044This is useful in situations where you are using Query Builder to generate SQL
WanWizard7219c072011-12-28 14:09:05 +01001045(ex. ``$this->db->get_compiled_select()``) but then choose to, for instance,
Kyle Farris48d8fb62011-10-14 17:59:49 -03001046run the query::
1047
1048 // Note that the second parameter of the get_compiled_select method is FALSE
1049 $sql = $this->db->select(array('field1','field2'))
1050 ->where('field3',5)
1051 ->get_compiled_select('mytable', FALSE);
1052
1053 // ...
1054 // Do something crazy with the SQL code... like add it to a cron script for
1055 // later execution or something...
1056 // ...
1057
1058 $data = $this->db->get()->result_array();
1059
1060 // Would execute and return an array of results of the following query:
Andrey Andreev896d3e32014-01-07 17:13:25 +02001061 // SELECT field1, field1 from mytable where field3 = 5;
1062
1063.. note:: Double calls to ``get_compiled_select()`` while you're using the
1064 Query Builder Caching functionality and NOT resetting your queries
1065 will results in the cache being merged twice. That in turn will
1066 i.e. if you're caching a ``select()`` - select the same field twice.