blob: 5380d09981d3d0bb230d0f6096c63511a99636ac [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
Kyle Farris48d8fb62011-10-14 17:59:49 -030071will be reset (by default it will be&mdash;just like `$this->db->get()`)::
72
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
79 // Produces string: SELECT title, content, date FROM mytable
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
348This function enables you to generate **LIKE** clauses, useful for doing
349searches.
350
351.. note:: All values passed to this function are escaped automatically.
352
353#. **Simple key/value method:**
354
355 ::
356
WanWizard7219c072011-12-28 14:09:05 +0100357 $this->db->like('title', 'match'); // Produces: WHERE title LIKE '%match%'
Derek Jones8ede1a22011-10-05 13:34:52 -0500358
359 If you use multiple function calls they will be chained together with
360 AND between them::
361
362 $this->db->like('title', 'match');
363 $this->db->like('body', 'match');
364 // WHERE title LIKE '%match%' AND body LIKE '%match%
365
366 If you want to control where the wildcard (%) is placed, you can use
367 an optional third argument. Your options are 'before', 'after' and
368 'both' (which is the default).
369
370 ::
371
372 $this->db->like('title', 'match', 'before'); // Produces: WHERE title LIKE '%match'
373 $this->db->like('title', 'match', 'after'); // Produces: WHERE title LIKE 'match%'
WanWizard7219c072011-12-28 14:09:05 +0100374 $this->db->like('title', 'match', 'both'); // Produces: WHERE title LIKE '%match%'
Derek Jones8ede1a22011-10-05 13:34:52 -0500375
376#. **Associative array method:**
377
378 ::
379
380 $array = array('title' => $match, 'page1' => $match, 'page2' => $match);
381 $this->db->like($array);
382 // WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'
383
384
385$this->db->or_like()
386====================
387
388This function is identical to the one above, except that multiple
389instances are joined by OR::
390
391 $this->db->like('title', 'match'); $this->db->or_like('body', $match);
392 // WHERE title LIKE '%match%' OR body LIKE '%match%'
393
394.. note:: or_like() was formerly known as orlike(), which has been removed.
395
396$this->db->not_like()
397=====================
398
399This function is identical to **like()**, except that it generates NOT
400LIKE statements::
401
402 $this->db->not_like('title', 'match'); // WHERE title NOT LIKE '%match%
403
404$this->db->or_not_like()
405========================
406
407This function is identical to **not_like()**, except that multiple
408instances are joined by OR::
409
410 $this->db->like('title', 'match');
411 $this->db->or_not_like('body', 'match');
412 // WHERE title LIKE '%match% OR body NOT LIKE '%match%'
413
414$this->db->group_by()
415=====================
416
417Permits you to write the GROUP BY portion of your query::
418
419 $this->db->group_by("title"); // Produces: GROUP BY title
420
421You can also pass an array of multiple values as well::
422
423 $this->db->group_by(array("title", "date")); // Produces: GROUP BY title, date
424
425.. note:: group_by() was formerly known as groupby(), which has been
426 removed.
427
428$this->db->distinct()
429=====================
430
431Adds the "DISTINCT" keyword to a query
432
433::
434
435 $this->db->distinct();
436 $this->db->get('table'); // Produces: SELECT DISTINCT * FROM table
437
438
439$this->db->having()
440===================
441
442Permits you to write the HAVING portion of your query. There are 2
443possible syntaxes, 1 argument or 2::
444
445 $this->db->having('user_id = 45'); // Produces: HAVING user_id = 45
WanWizard7219c072011-12-28 14:09:05 +0100446 $this->db->having('user_id', 45); // Produces: HAVING user_id = 45
Derek Jones8ede1a22011-10-05 13:34:52 -0500447
448You can also pass an array of multiple values as well::
449
450 $this->db->having(array('title =' => 'My Title', 'id <' => $id));
451 // Produces: HAVING title = 'My Title', id < 45
452
453
454If you are using a database that CodeIgniter escapes queries for, you
455can prevent escaping content by passing an optional third argument, and
456setting it to FALSE.
457
458::
459
460 $this->db->having('user_id', 45); // Produces: HAVING `user_id` = 45 in some databases such as MySQL
461 $this->db->having('user_id', 45, FALSE); // Produces: HAVING user_id = 45
462
463
464$this->db->or_having()
465======================
466
467Identical to having(), only separates multiple clauses with "OR".
468
469$this->db->order_by()
470=====================
471
472Lets you set an ORDER BY clause. The first parameter contains the name
473of the column you would like to order by. The second parameter lets you
474set the direction of the result. Options are asc or desc, or random.
475
476::
477
478 $this->db->order_by("title", "desc"); // Produces: ORDER BY title DESC
479
480You can also pass your own string in the first parameter::
481
482 $this->db->order_by('title desc, name asc'); // Produces: ORDER BY title DESC, name ASC
483
484Or multiple function calls can be made if you need multiple fields.
485
486::
487
488 $this->db->order_by("title", "desc");
WanWizard7219c072011-12-28 14:09:05 +0100489 $this->db->order_by("name", "asc"); // Produces: ORDER BY title DESC, name ASC
Derek Jones8ede1a22011-10-05 13:34:52 -0500490
491
492.. note:: order_by() was formerly known as orderby(), which has been
493 removed.
494
495.. note:: random ordering is not currently supported in Oracle or MSSQL
496 drivers. These will default to 'ASC'.
497
498$this->db->limit()
499==================
500
501Lets you limit the number of rows you would like returned by the query::
502
503 $this->db->limit(10); // Produces: LIMIT 10
504
505The second parameter lets you set a result offset.
506
507::
508
509 $this->db->limit(10, 20); // Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
510
511$this->db->count_all_results()
512==============================
513
514Permits you to determine the number of rows in a particular Active
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000515Record query. Queries will accept Query Builder restrictors such as
Derek Jones8ede1a22011-10-05 13:34:52 -0500516where(), or_where(), like(), or_like(), etc. Example::
517
518 echo $this->db->count_all_results('my_table'); // Produces an integer, like 25
519 $this->db->like('title', 'match');
520 $this->db->from('my_table');
WanWizard7219c072011-12-28 14:09:05 +0100521 echo $this->db->count_all_results(); // Produces an integer, like 17
Derek Jones8ede1a22011-10-05 13:34:52 -0500522
523$this->db->count_all()
524======================
525
526Permits you to determine the number of rows in a particular table.
527Submit the table name in the first parameter. Example::
528
529 echo $this->db->count_all('my_table'); // Produces an integer, like 25
530
531**************
WanWizard7219c072011-12-28 14:09:05 +0100532Query grouping
533**************
534
535Query grouping allows you to create groups of WHERE clauses by enclosing them in parentheses. This will allow
Timothy Warrene464b392012-03-13 14:09:31 -0400536you to create queries with complex WHERE clauses. Nested groups are supported. Example::
WanWizard7219c072011-12-28 14:09:05 +0100537
538 $this->db->select('*')->from('my_table')
539 ->group_start()
540 ->where('a', 'a')
541 ->or_group_start()
542 ->where('b', 'b')
543 ->where('c', 'c')
544 ->group_end()
545 ->group_end()
546 ->where('d', 'd')
547 ->get();
548
549 // Generates:
550 // SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
551
552.. note:: groups need to be balanced, make sure every group_start() is matched by a group_end().
553
554$this->db->group_start()
555========================
556
557Starts a new group by adding an opening parenthesis to the WHERE clause of the query.
558
559$this->db->or_group_start()
560===========================
561
562Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR'.
563
564$this->db->not_group_start()
565============================
566
567Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'NOT'.
568
569$this->db->or_not_group_start()
570===============================
571
572Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR NOT'.
573
574$this->db->group_end()
575======================
576
577Ends the current group by adding an closing parenthesis to the WHERE clause of the query.
578
579**************
Derek Jones8ede1a22011-10-05 13:34:52 -0500580Inserting Data
581**************
582
583$this->db->insert()
584===================
585
586Generates an insert string based on the data you supply, and runs the
587query. You can either pass an **array** or an **object** to the
588function. Here is an example using an array::
589
590 $data = array(
591 'title' => 'My title',
592 'name' => 'My Name',
593 'date' => 'My date'
594 );
WanWizard7219c072011-12-28 14:09:05 +0100595
Derek Jones8ede1a22011-10-05 13:34:52 -0500596 $this->db->insert('mytable', $data);
597 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
598
599The first parameter will contain the table name, the second is an
600associative array of values.
601
602Here is an example using an object::
603
604 /*
605 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200606 public $title = 'My Title';
607 public $content = 'My Content';
608 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500609 }
610 */
WanWizard7219c072011-12-28 14:09:05 +0100611
Derek Jones8ede1a22011-10-05 13:34:52 -0500612 $object = new Myclass;
613 $this->db->insert('mytable', $object);
614 // Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
615
616The first parameter will contain the table name, the second is an
617object.
618
619.. note:: All values are escaped automatically producing safer queries.
620
Kyle Farris48d8fb62011-10-14 17:59:49 -0300621$this->db->get_compiled_insert()
622================================
WanWizard7219c072011-12-28 14:09:05 +0100623Compiles the insertion query just like `$this->db->insert()`_ but does not
Kyle Farris48d8fb62011-10-14 17:59:49 -0300624*run* the query. This method simply returns the SQL query as a string.
625
626Example::
627
628 $data = array(
629 'title' => 'My title',
630 'name' => 'My Name',
631 'date' => 'My date'
632 );
WanWizard7219c072011-12-28 14:09:05 +0100633
Kyle Farris48d8fb62011-10-14 17:59:49 -0300634 $sql = $this->db->set($data)->get_compiled_insert('mytable');
635 echo $sql;
WanWizard7219c072011-12-28 14:09:05 +0100636
Kyle Farris48d8fb62011-10-14 17:59:49 -0300637 // Produces string: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
638
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000639The second parameter enables you to set whether or not the query builder query
Kyle Farris48d8fb62011-10-14 17:59:49 -0300640will be reset (by default it will be--just like `$this->db->insert()`_)::
WanWizard7219c072011-12-28 14:09:05 +0100641
Kyle Farris48d8fb62011-10-14 17:59:49 -0300642 echo $this->db->set('title', 'My Title')->get_compiled_insert('mytable', FALSE);
WanWizard7219c072011-12-28 14:09:05 +0100643
Kyle Farris48d8fb62011-10-14 17:59:49 -0300644 // Produces string: INSERT INTO mytable (title) VALUES ('My Title')
WanWizard7219c072011-12-28 14:09:05 +0100645
Kyle Farris48d8fb62011-10-14 17:59:49 -0300646 echo $this->db->set('content', 'My Content')->get_compiled_insert();
647
648 // Produces string: INSERT INTO mytable (title, content) VALUES ('My Title', 'My Content')
WanWizard7219c072011-12-28 14:09:05 +0100649
650The key thing to notice in the above example is that the second query did not
651utlize `$this->db->from()`_ nor did it pass a table name into the first
652parameter. The reason this worked is because the query has not been executed
653using `$this->db->insert()`_ which resets values or reset directly using
Kyle Farris48d8fb62011-10-14 17:59:49 -0300654`$this->db->reset_query()`_.
655
Derek Jones8ede1a22011-10-05 13:34:52 -0500656$this->db->insert_batch()
657=========================
658
659Generates an insert string based on the data you supply, and runs the
660query. You can either pass an **array** or an **object** to the
661function. Here is an example using an array::
662
663 $data = array(
664 array(
665 'title' => 'My title',
666 'name' => 'My Name',
667 'date' => 'My date'
668 ),
669 array(
670 'title' => 'Another title',
671 'name' => 'Another Name',
672 'date' => 'Another date'
673 )
674 );
WanWizard7219c072011-12-28 14:09:05 +0100675
Derek Jones8ede1a22011-10-05 13:34:52 -0500676 $this->db->insert_batch('mytable', $data);
677 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
678
679The first parameter will contain the table name, the second is an
680associative array of values.
681
682.. note:: All values are escaped automatically producing safer queries.
683
Andrey Andreev04c50f52012-10-24 23:05:25 +0300684$this->db->replace()
685====================
686
687This method executes a REPLACE statement, which is basically the SQL
688standard for (optional) DELETE + INSERT, using *PRIMARY* and *UNIQUE*
689keys as the determining factor.
690In our case, it will save you from the need to implement complex
691logics with different combinations of ``select()``, ``update()``,
692``delete()`` and ``insert()`` calls.
693
694Example::
695
696 $data = array(
697 'title' => 'My title',
698 'name' => 'My Name',
699 'date' => 'My date'
700 );
701
702 $this->db->replace('table', $data);
703
704 // Executes: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
705
706In the above example, if we assume that the *title* field is our primary
707key, then if a row containing 'My title' as the *title* value, that row
708will be deleted with our new row data replacing it.
709
710Usage of the ``set()`` method is also allowed and all fields are
711automatically escaped, just like with ``insert()``.
712
Derek Jones8ede1a22011-10-05 13:34:52 -0500713$this->db->set()
714================
715
716This function enables you to set values for inserts or updates.
717
718**It can be used instead of passing a data array directly to the insert
719or update functions:**
720
721::
722
723 $this->db->set('name', $name);
724 $this->db->insert('mytable'); // Produces: INSERT INTO mytable (name) VALUES ('{$name}')
725
726If you use multiple function called they will be assembled properly
727based on whether you are doing an insert or an update::
728
729 $this->db->set('name', $name);
730 $this->db->set('title', $title);
731 $this->db->set('status', $status);
WanWizard7219c072011-12-28 14:09:05 +0100732 $this->db->insert('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500733
734**set()** will also accept an optional third parameter ($escape), that
735will prevent data from being escaped if set to FALSE. To illustrate the
736difference, here is set() used both with and without the escape
737parameter.
738
739::
740
741 $this->db->set('field', 'field+1', FALSE);
742 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES (field+1)
743 $this->db->set('field', 'field+1');
744 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES ('field+1')
745
746
747You can also pass an associative array to this function::
748
749 $array = array(
750 'name' => $name,
751 'title' => $title,
752 'status' => $status
753 );
WanWizard7219c072011-12-28 14:09:05 +0100754
Derek Jones8ede1a22011-10-05 13:34:52 -0500755 $this->db->set($array);
756 $this->db->insert('mytable');
757
758Or an object::
759
760 /*
761 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200762 public $title = 'My Title';
763 public $content = 'My Content';
764 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500765 }
766 */
WanWizard7219c072011-12-28 14:09:05 +0100767
Derek Jones8ede1a22011-10-05 13:34:52 -0500768 $object = new Myclass;
769 $this->db->set($object);
770 $this->db->insert('mytable');
771
Derek Jones8ede1a22011-10-05 13:34:52 -0500772*************
773Updating Data
774*************
775
776$this->db->update()
777===================
778
779Generates an update string and runs the query based on the data you
780supply. You can pass an **array** or an **object** to the function. Here
781is an example using an array::
782
783 $data = array(
784 'title' => $title,
785 'name' => $name,
786 'date' => $date
787 );
WanWizard7219c072011-12-28 14:09:05 +0100788
Derek Jones8ede1a22011-10-05 13:34:52 -0500789 $this->db->where('id', $id);
790 $this->db->update('mytable', $data);
791 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
792
793Or you can supply an object::
794
795 /*
796 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200797 public $title = 'My Title';
798 public $content = 'My Content';
799 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500800 }
801 */
WanWizard7219c072011-12-28 14:09:05 +0100802
Derek Jones8ede1a22011-10-05 13:34:52 -0500803 $object = new Myclass;
804 $this->db->where('id', $id);
805 $this->db->update('mytable', $object);
806 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
807
808.. note:: All values are escaped automatically producing safer queries.
809
810You'll notice the use of the $this->db->where() function, enabling you
811to set the WHERE clause. You can optionally pass this information
812directly into the update function as a string::
813
814 $this->db->update('mytable', $data, "id = 4");
815
816Or as an array::
817
818 $this->db->update('mytable', $data, array('id' => $id));
819
820You may also use the $this->db->set() function described above when
821performing updates.
822
Andrey Andreev04c50f52012-10-24 23:05:25 +0300823
Derek Jones8ede1a22011-10-05 13:34:52 -0500824$this->db->update_batch()
825=========================
826
827Generates an update string based on the data you supply, and runs the query.
828You can either pass an **array** or an **object** to the function.
829Here is an example using an array::
830
831 $data = array(
832 array(
833 'title' => 'My title' ,
834 'name' => 'My Name 2' ,
835 'date' => 'My date 2'
836 ),
837 array(
838 'title' => 'Another title' ,
839 'name' => 'Another Name 2' ,
840 'date' => 'Another date 2'
841 )
842 );
843
WanWizard7219c072011-12-28 14:09:05 +0100844 $this->db->update_batch('mytable', $data, 'title');
Derek Jones8ede1a22011-10-05 13:34:52 -0500845
WanWizard7219c072011-12-28 14:09:05 +0100846 // Produces:
Derek Jones8ede1a22011-10-05 13:34:52 -0500847 // UPDATE `mytable` SET `name` = CASE
848 // WHEN `title` = 'My title' THEN 'My Name 2'
849 // WHEN `title` = 'Another title' THEN 'Another Name 2'
850 // ELSE `name` END,
WanWizard7219c072011-12-28 14:09:05 +0100851 // `date` = CASE
Derek Jones8ede1a22011-10-05 13:34:52 -0500852 // WHEN `title` = 'My title' THEN 'My date 2'
853 // WHEN `title` = 'Another title' THEN 'Another date 2'
854 // ELSE `date` END
855 // WHERE `title` IN ('My title','Another title')
856
857The first parameter will contain the table name, the second is an associative
858array of values, the third parameter is the where key.
859
860.. note:: All values are escaped automatically producing safer queries.
861
Andrey Andreev9f808b02012-10-24 17:38:48 +0300862.. note:: ``affected_rows()`` won't give you proper results with this method,
863 due to the very nature of how it works. Instead, ``update_batch()``
864 returns the number of rows affected.
865
Kyle Farris48d8fb62011-10-14 17:59:49 -0300866$this->db->get_compiled_update()
867================================
868
869This works exactly the same way as ``$this->db->get_compiled_insert()`` except
870that it produces an UPDATE SQL string instead of an INSERT SQL string.
871
Greg Akerffd24a42011-12-25 22:27:59 -0600872For more information view documentation for `$this->db->get_compiled_insert()`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -0300873
Derek Jones8ede1a22011-10-05 13:34:52 -0500874
875*************
876Deleting Data
877*************
878
879$this->db->delete()
880===================
881
882Generates a delete SQL string and runs the query.
883
884::
885
886 $this->db->delete('mytable', array('id' => $id)); // Produces: // DELETE FROM mytable // WHERE id = $id
887
888The first parameter is the table name, the second is the where clause.
889You can also use the where() or or_where() functions instead of passing
890the data to the second parameter of the function::
891
892 $this->db->where('id', $id);
893 $this->db->delete('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100894
Derek Jones8ede1a22011-10-05 13:34:52 -0500895 // Produces:
896 // DELETE FROM mytable
897 // WHERE id = $id
898
899
900An array of table names can be passed into delete() if you would like to
901delete data from more than 1 table.
902
903::
904
905 $tables = array('table1', 'table2', 'table3');
906 $this->db->where('id', '5');
907 $this->db->delete($tables);
908
909
910If you want to delete all data from a table, you can use the truncate()
911function, or empty_table().
912
913$this->db->empty_table()
914========================
915
916Generates a delete SQL string and runs the
917query.::
918
kenjisc35d2c92011-10-26 17:09:17 +0900919 $this->db->empty_table('mytable'); // Produces: DELETE FROM mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500920
921
922$this->db->truncate()
923=====================
924
925Generates a truncate SQL string and runs the query.
926
927::
928
929 $this->db->from('mytable');
kenjisc35d2c92011-10-26 17:09:17 +0900930 $this->db->truncate();
WanWizard7219c072011-12-28 14:09:05 +0100931
932 // or
933
Derek Jones8ede1a22011-10-05 13:34:52 -0500934 $this->db->truncate('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100935
Derek Jones8ede1a22011-10-05 13:34:52 -0500936 // Produce:
WanWizard7219c072011-12-28 14:09:05 +0100937 // TRUNCATE mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500938
939.. note:: If the TRUNCATE command isn't available, truncate() will
940 execute as "DELETE FROM table".
WanWizard7219c072011-12-28 14:09:05 +0100941
Kyle Farris48d8fb62011-10-14 17:59:49 -0300942$this->db->get_compiled_delete()
943================================
944This works exactly the same way as ``$this->db->get_compiled_insert()`` except
945that it produces a DELETE SQL string instead of an INSERT SQL string.
946
Greg Akerffd24a42011-12-25 22:27:59 -0600947For more information view documentation for `$this->db->get_compiled_insert()`_.
Derek Jones8ede1a22011-10-05 13:34:52 -0500948
949***************
950Method Chaining
951***************
952
953Method chaining allows you to simplify your syntax by connecting
954multiple functions. Consider this example::
955
956 $query = $this->db->select('title')
Timothy Warrene464b392012-03-13 14:09:31 -0400957 ->where('id', $id)
958 ->limit(10, 20)
959 ->get('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500960
Derek Jones8ede1a22011-10-05 13:34:52 -0500961.. _ar-caching:
962
963*********************
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000964Query Builder Caching
Derek Jones8ede1a22011-10-05 13:34:52 -0500965*********************
966
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000967While not "true" caching, Query Builder enables you to save (or "cache")
Derek Jones8ede1a22011-10-05 13:34:52 -0500968certain parts of your queries for reuse at a later point in your
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000969script's execution. Normally, when an Query Builder call is completed,
Derek Jones8ede1a22011-10-05 13:34:52 -0500970all stored information is reset for the next call. With caching, you can
971prevent this reset, and reuse information easily.
972
973Cached calls are cumulative. If you make 2 cached select() calls, and
974then 2 uncached select() calls, this will result in 4 select() calls.
975There are three Caching functions available:
976
977$this->db->start_cache()
978========================
979
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000980This function must be called to begin caching. All Query Builder queries
Derek Jones8ede1a22011-10-05 13:34:52 -0500981of the correct type (see below for supported queries) are stored for
982later use.
983
984$this->db->stop_cache()
985=======================
986
987This function can be called to stop caching.
988
989$this->db->flush_cache()
990========================
991
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000992This function deletes all items from the Query Builder cache.
Derek Jones8ede1a22011-10-05 13:34:52 -0500993
994Here's a usage example::
995
996 $this->db->start_cache();
997 $this->db->select('field1');
998 $this->db->stop_cache();
999 $this->db->get('tablename');
1000 //Generates: SELECT `field1` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001001
Derek Jones8ede1a22011-10-05 13:34:52 -05001002 $this->db->select('field2');
1003 $this->db->get('tablename');
1004 //Generates: SELECT `field1`, `field2` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001005
Derek Jones8ede1a22011-10-05 13:34:52 -05001006 $this->db->flush_cache();
1007 $this->db->select('field2');
1008 $this->db->get('tablename');
1009 //Generates: SELECT `field2` FROM (`tablename`)
1010
1011
1012.. note:: The following statements can be cached: select, from, join,
1013 where, like, group_by, having, order_by, set
1014
1015
Greg Akerffd24a42011-12-25 22:27:59 -06001016$this->db->reset_query()
1017========================
Kyle Farris48d8fb62011-10-14 17:59:49 -03001018
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001019Resetting Query Builder allows you to start fresh with your query without
WanWizard7219c072011-12-28 14:09:05 +01001020executing it first using a method like $this->db->get() or $this->db->insert().
1021Just like the methods that execute a query, this will *not* reset items you've
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001022cached using `Query Builder Caching`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -03001023
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001024This is useful in situations where you are using Query Builder to generate SQL
WanWizard7219c072011-12-28 14:09:05 +01001025(ex. ``$this->db->get_compiled_select()``) but then choose to, for instance,
Kyle Farris48d8fb62011-10-14 17:59:49 -03001026run the query::
1027
1028 // Note that the second parameter of the get_compiled_select method is FALSE
1029 $sql = $this->db->select(array('field1','field2'))
1030 ->where('field3',5)
1031 ->get_compiled_select('mytable', FALSE);
1032
1033 // ...
1034 // Do something crazy with the SQL code... like add it to a cron script for
1035 // later execution or something...
1036 // ...
1037
1038 $data = $this->db->get()->result_array();
1039
1040 // Would execute and return an array of results of the following query:
1041 // SELECT field1, field1 from mytable where field3 = 5;