blob: 8fb906052c39ec5ab48296c6a9e2c0ab54c76724 [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
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200472Lets you set an ORDER BY clause.
473
474The first parameter contains the name of the column you would like to order by.
475
476The second parameter lets you set the direction of the result.
477Options are **ASC**, **DESC** AND **RANDOM**.
Derek Jones8ede1a22011-10-05 13:34:52 -0500478
479::
480
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200481 $this->db->order_by('title', 'DESC');
482 // Produces: ORDER BY `title` DESC
Derek Jones8ede1a22011-10-05 13:34:52 -0500483
484You can also pass your own string in the first parameter::
485
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200486 $this->db->order_by('title DESC, name ASC');
487 // Produces: ORDER BY `title` DESC, `name` ASC
Derek Jones8ede1a22011-10-05 13:34:52 -0500488
489Or multiple function calls can be made if you need multiple fields.
490
491::
492
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200493 $this->db->order_by('title', 'DESC');
494 $this->db->order_by('name', 'ASC');
495 // Produces: ORDER BY `title` DESC, `name` ASC
Derek Jones8ede1a22011-10-05 13:34:52 -0500496
Andrey Andreev98e46cf2012-11-13 03:01:42 +0200497If you choose the **RANDOM** direction option, then the first parameters will
498be ignored, unless you specify a numeric seed value.
499
500::
501
502 $this->db->order_by('title', 'RANDOM');
503 // Produces: ORDER BY RAND()
504
505 $this->db->order_by(42, 'RANDOM');
506 // Produces: ORDER BY RAND(42)
Derek Jones8ede1a22011-10-05 13:34:52 -0500507
508.. note:: order_by() was formerly known as orderby(), which has been
509 removed.
510
Andrey Andreev0dfb62f2012-10-30 11:37:15 +0200511.. note:: Random ordering is not currently supported in Oracle and
512 will default to ASC instead.
Derek Jones8ede1a22011-10-05 13:34:52 -0500513
514$this->db->limit()
515==================
516
517Lets you limit the number of rows you would like returned by the query::
518
519 $this->db->limit(10); // Produces: LIMIT 10
520
521The second parameter lets you set a result offset.
522
523::
524
525 $this->db->limit(10, 20); // Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
526
527$this->db->count_all_results()
528==============================
529
530Permits you to determine the number of rows in a particular Active
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000531Record query. Queries will accept Query Builder restrictors such as
Derek Jones8ede1a22011-10-05 13:34:52 -0500532where(), or_where(), like(), or_like(), etc. Example::
533
534 echo $this->db->count_all_results('my_table'); // Produces an integer, like 25
535 $this->db->like('title', 'match');
536 $this->db->from('my_table');
WanWizard7219c072011-12-28 14:09:05 +0100537 echo $this->db->count_all_results(); // Produces an integer, like 17
Derek Jones8ede1a22011-10-05 13:34:52 -0500538
539$this->db->count_all()
540======================
541
542Permits you to determine the number of rows in a particular table.
543Submit the table name in the first parameter. Example::
544
545 echo $this->db->count_all('my_table'); // Produces an integer, like 25
546
547**************
WanWizard7219c072011-12-28 14:09:05 +0100548Query grouping
549**************
550
551Query grouping allows you to create groups of WHERE clauses by enclosing them in parentheses. This will allow
Timothy Warrene464b392012-03-13 14:09:31 -0400552you to create queries with complex WHERE clauses. Nested groups are supported. Example::
WanWizard7219c072011-12-28 14:09:05 +0100553
554 $this->db->select('*')->from('my_table')
555 ->group_start()
556 ->where('a', 'a')
557 ->or_group_start()
558 ->where('b', 'b')
559 ->where('c', 'c')
560 ->group_end()
561 ->group_end()
562 ->where('d', 'd')
563 ->get();
564
565 // Generates:
566 // SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
567
568.. note:: groups need to be balanced, make sure every group_start() is matched by a group_end().
569
570$this->db->group_start()
571========================
572
573Starts a new group by adding an opening parenthesis to the WHERE clause of the query.
574
575$this->db->or_group_start()
576===========================
577
578Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR'.
579
580$this->db->not_group_start()
581============================
582
583Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'NOT'.
584
585$this->db->or_not_group_start()
586===============================
587
588Starts a new group by adding an opening parenthesis to the WHERE clause of the query, prefixing it with 'OR NOT'.
589
590$this->db->group_end()
591======================
592
593Ends the current group by adding an closing parenthesis to the WHERE clause of the query.
594
595**************
Derek Jones8ede1a22011-10-05 13:34:52 -0500596Inserting Data
597**************
598
599$this->db->insert()
600===================
601
602Generates an insert string based on the data you supply, and runs the
603query. You can either pass an **array** or an **object** to the
604function. Here is an example using an array::
605
606 $data = array(
607 'title' => 'My title',
608 'name' => 'My Name',
609 'date' => 'My date'
610 );
WanWizard7219c072011-12-28 14:09:05 +0100611
Derek Jones8ede1a22011-10-05 13:34:52 -0500612 $this->db->insert('mytable', $data);
613 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
614
615The first parameter will contain the table name, the second is an
616associative array of values.
617
618Here is an example using an object::
619
620 /*
621 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200622 public $title = 'My Title';
623 public $content = 'My Content';
624 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500625 }
626 */
WanWizard7219c072011-12-28 14:09:05 +0100627
Derek Jones8ede1a22011-10-05 13:34:52 -0500628 $object = new Myclass;
629 $this->db->insert('mytable', $object);
630 // Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
631
632The first parameter will contain the table name, the second is an
633object.
634
635.. note:: All values are escaped automatically producing safer queries.
636
Kyle Farris48d8fb62011-10-14 17:59:49 -0300637$this->db->get_compiled_insert()
638================================
WanWizard7219c072011-12-28 14:09:05 +0100639Compiles the insertion query just like `$this->db->insert()`_ but does not
Kyle Farris48d8fb62011-10-14 17:59:49 -0300640*run* the query. This method simply returns the SQL query as a string.
641
642Example::
643
644 $data = array(
645 'title' => 'My title',
646 'name' => 'My Name',
647 'date' => 'My date'
648 );
WanWizard7219c072011-12-28 14:09:05 +0100649
Kyle Farris48d8fb62011-10-14 17:59:49 -0300650 $sql = $this->db->set($data)->get_compiled_insert('mytable');
651 echo $sql;
WanWizard7219c072011-12-28 14:09:05 +0100652
Kyle Farris48d8fb62011-10-14 17:59:49 -0300653 // Produces string: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
654
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000655The second parameter enables you to set whether or not the query builder query
Kyle Farris48d8fb62011-10-14 17:59:49 -0300656will be reset (by default it will be--just like `$this->db->insert()`_)::
WanWizard7219c072011-12-28 14:09:05 +0100657
Kyle Farris48d8fb62011-10-14 17:59:49 -0300658 echo $this->db->set('title', 'My Title')->get_compiled_insert('mytable', FALSE);
WanWizard7219c072011-12-28 14:09:05 +0100659
Kyle Farris48d8fb62011-10-14 17:59:49 -0300660 // Produces string: INSERT INTO mytable (title) VALUES ('My Title')
WanWizard7219c072011-12-28 14:09:05 +0100661
Kyle Farris48d8fb62011-10-14 17:59:49 -0300662 echo $this->db->set('content', 'My Content')->get_compiled_insert();
663
664 // Produces string: INSERT INTO mytable (title, content) VALUES ('My Title', 'My Content')
WanWizard7219c072011-12-28 14:09:05 +0100665
666The key thing to notice in the above example is that the second query did not
667utlize `$this->db->from()`_ nor did it pass a table name into the first
668parameter. The reason this worked is because the query has not been executed
669using `$this->db->insert()`_ which resets values or reset directly using
Kyle Farris48d8fb62011-10-14 17:59:49 -0300670`$this->db->reset_query()`_.
671
Derek Jones8ede1a22011-10-05 13:34:52 -0500672$this->db->insert_batch()
673=========================
674
675Generates an insert string based on the data you supply, and runs the
676query. You can either pass an **array** or an **object** to the
677function. Here is an example using an array::
678
679 $data = array(
680 array(
681 'title' => 'My title',
682 'name' => 'My Name',
683 'date' => 'My date'
684 ),
685 array(
686 'title' => 'Another title',
687 'name' => 'Another Name',
688 'date' => 'Another date'
689 )
690 );
WanWizard7219c072011-12-28 14:09:05 +0100691
Derek Jones8ede1a22011-10-05 13:34:52 -0500692 $this->db->insert_batch('mytable', $data);
693 // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
694
695The first parameter will contain the table name, the second is an
696associative array of values.
697
698.. note:: All values are escaped automatically producing safer queries.
699
Andrey Andreev04c50f52012-10-24 23:05:25 +0300700$this->db->replace()
701====================
702
703This method executes a REPLACE statement, which is basically the SQL
704standard for (optional) DELETE + INSERT, using *PRIMARY* and *UNIQUE*
705keys as the determining factor.
706In our case, it will save you from the need to implement complex
707logics with different combinations of ``select()``, ``update()``,
708``delete()`` and ``insert()`` calls.
709
710Example::
711
712 $data = array(
713 'title' => 'My title',
714 'name' => 'My Name',
715 'date' => 'My date'
716 );
717
718 $this->db->replace('table', $data);
719
720 // Executes: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
721
722In the above example, if we assume that the *title* field is our primary
723key, then if a row containing 'My title' as the *title* value, that row
724will be deleted with our new row data replacing it.
725
726Usage of the ``set()`` method is also allowed and all fields are
727automatically escaped, just like with ``insert()``.
728
Derek Jones8ede1a22011-10-05 13:34:52 -0500729$this->db->set()
730================
731
732This function enables you to set values for inserts or updates.
733
734**It can be used instead of passing a data array directly to the insert
735or update functions:**
736
737::
738
739 $this->db->set('name', $name);
740 $this->db->insert('mytable'); // Produces: INSERT INTO mytable (name) VALUES ('{$name}')
741
742If you use multiple function called they will be assembled properly
743based on whether you are doing an insert or an update::
744
745 $this->db->set('name', $name);
746 $this->db->set('title', $title);
747 $this->db->set('status', $status);
WanWizard7219c072011-12-28 14:09:05 +0100748 $this->db->insert('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500749
750**set()** will also accept an optional third parameter ($escape), that
751will prevent data from being escaped if set to FALSE. To illustrate the
752difference, here is set() used both with and without the escape
753parameter.
754
755::
756
757 $this->db->set('field', 'field+1', FALSE);
758 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES (field+1)
759 $this->db->set('field', 'field+1');
760 $this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES ('field+1')
761
762
763You can also pass an associative array to this function::
764
765 $array = array(
766 'name' => $name,
767 'title' => $title,
768 'status' => $status
769 );
WanWizard7219c072011-12-28 14:09:05 +0100770
Derek Jones8ede1a22011-10-05 13:34:52 -0500771 $this->db->set($array);
772 $this->db->insert('mytable');
773
774Or an object::
775
776 /*
777 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200778 public $title = 'My Title';
779 public $content = 'My Content';
780 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500781 }
782 */
WanWizard7219c072011-12-28 14:09:05 +0100783
Derek Jones8ede1a22011-10-05 13:34:52 -0500784 $object = new Myclass;
785 $this->db->set($object);
786 $this->db->insert('mytable');
787
Derek Jones8ede1a22011-10-05 13:34:52 -0500788*************
789Updating Data
790*************
791
792$this->db->update()
793===================
794
795Generates an update string and runs the query based on the data you
796supply. You can pass an **array** or an **object** to the function. Here
797is an example using an array::
798
799 $data = array(
800 'title' => $title,
801 'name' => $name,
802 'date' => $date
803 );
WanWizard7219c072011-12-28 14:09:05 +0100804
Derek Jones8ede1a22011-10-05 13:34:52 -0500805 $this->db->where('id', $id);
806 $this->db->update('mytable', $data);
807 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
808
809Or you can supply an object::
810
811 /*
812 class Myclass {
vlakoffff3f7de2012-06-16 14:21:32 +0200813 public $title = 'My Title';
814 public $content = 'My Content';
815 public $date = 'My Date';
Derek Jones8ede1a22011-10-05 13:34:52 -0500816 }
817 */
WanWizard7219c072011-12-28 14:09:05 +0100818
Derek Jones8ede1a22011-10-05 13:34:52 -0500819 $object = new Myclass;
820 $this->db->where('id', $id);
821 $this->db->update('mytable', $object);
822 // Produces: // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
823
824.. note:: All values are escaped automatically producing safer queries.
825
826You'll notice the use of the $this->db->where() function, enabling you
827to set the WHERE clause. You can optionally pass this information
828directly into the update function as a string::
829
830 $this->db->update('mytable', $data, "id = 4");
831
832Or as an array::
833
834 $this->db->update('mytable', $data, array('id' => $id));
835
836You may also use the $this->db->set() function described above when
837performing updates.
838
Andrey Andreev04c50f52012-10-24 23:05:25 +0300839
Derek Jones8ede1a22011-10-05 13:34:52 -0500840$this->db->update_batch()
841=========================
842
843Generates an update string based on the data you supply, and runs the query.
844You can either pass an **array** or an **object** to the function.
845Here is an example using an array::
846
847 $data = array(
848 array(
849 'title' => 'My title' ,
850 'name' => 'My Name 2' ,
851 'date' => 'My date 2'
852 ),
853 array(
854 'title' => 'Another title' ,
855 'name' => 'Another Name 2' ,
856 'date' => 'Another date 2'
857 )
858 );
859
WanWizard7219c072011-12-28 14:09:05 +0100860 $this->db->update_batch('mytable', $data, 'title');
Derek Jones8ede1a22011-10-05 13:34:52 -0500861
WanWizard7219c072011-12-28 14:09:05 +0100862 // Produces:
Derek Jones8ede1a22011-10-05 13:34:52 -0500863 // UPDATE `mytable` SET `name` = CASE
864 // WHEN `title` = 'My title' THEN 'My Name 2'
865 // WHEN `title` = 'Another title' THEN 'Another Name 2'
866 // ELSE `name` END,
WanWizard7219c072011-12-28 14:09:05 +0100867 // `date` = CASE
Derek Jones8ede1a22011-10-05 13:34:52 -0500868 // WHEN `title` = 'My title' THEN 'My date 2'
869 // WHEN `title` = 'Another title' THEN 'Another date 2'
870 // ELSE `date` END
871 // WHERE `title` IN ('My title','Another title')
872
873The first parameter will contain the table name, the second is an associative
874array of values, the third parameter is the where key.
875
876.. note:: All values are escaped automatically producing safer queries.
877
Andrey Andreev9f808b02012-10-24 17:38:48 +0300878.. note:: ``affected_rows()`` won't give you proper results with this method,
879 due to the very nature of how it works. Instead, ``update_batch()``
880 returns the number of rows affected.
881
Kyle Farris48d8fb62011-10-14 17:59:49 -0300882$this->db->get_compiled_update()
883================================
884
885This works exactly the same way as ``$this->db->get_compiled_insert()`` except
886that it produces an UPDATE SQL string instead of an INSERT SQL string.
887
Greg Akerffd24a42011-12-25 22:27:59 -0600888For more information view documentation for `$this->db->get_compiled_insert()`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -0300889
Derek Jones8ede1a22011-10-05 13:34:52 -0500890
891*************
892Deleting Data
893*************
894
895$this->db->delete()
896===================
897
898Generates a delete SQL string and runs the query.
899
900::
901
902 $this->db->delete('mytable', array('id' => $id)); // Produces: // DELETE FROM mytable // WHERE id = $id
903
904The first parameter is the table name, the second is the where clause.
905You can also use the where() or or_where() functions instead of passing
906the data to the second parameter of the function::
907
908 $this->db->where('id', $id);
909 $this->db->delete('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100910
Derek Jones8ede1a22011-10-05 13:34:52 -0500911 // Produces:
912 // DELETE FROM mytable
913 // WHERE id = $id
914
915
916An array of table names can be passed into delete() if you would like to
917delete data from more than 1 table.
918
919::
920
921 $tables = array('table1', 'table2', 'table3');
922 $this->db->where('id', '5');
923 $this->db->delete($tables);
924
925
926If you want to delete all data from a table, you can use the truncate()
927function, or empty_table().
928
929$this->db->empty_table()
930========================
931
932Generates a delete SQL string and runs the
933query.::
934
kenjisc35d2c92011-10-26 17:09:17 +0900935 $this->db->empty_table('mytable'); // Produces: DELETE FROM mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500936
937
938$this->db->truncate()
939=====================
940
941Generates a truncate SQL string and runs the query.
942
943::
944
945 $this->db->from('mytable');
kenjisc35d2c92011-10-26 17:09:17 +0900946 $this->db->truncate();
WanWizard7219c072011-12-28 14:09:05 +0100947
948 // or
949
Derek Jones8ede1a22011-10-05 13:34:52 -0500950 $this->db->truncate('mytable');
WanWizard7219c072011-12-28 14:09:05 +0100951
Derek Jones8ede1a22011-10-05 13:34:52 -0500952 // Produce:
WanWizard7219c072011-12-28 14:09:05 +0100953 // TRUNCATE mytable
Derek Jones8ede1a22011-10-05 13:34:52 -0500954
955.. note:: If the TRUNCATE command isn't available, truncate() will
956 execute as "DELETE FROM table".
WanWizard7219c072011-12-28 14:09:05 +0100957
Kyle Farris48d8fb62011-10-14 17:59:49 -0300958$this->db->get_compiled_delete()
959================================
960This works exactly the same way as ``$this->db->get_compiled_insert()`` except
961that it produces a DELETE SQL string instead of an INSERT SQL string.
962
Greg Akerffd24a42011-12-25 22:27:59 -0600963For more information view documentation for `$this->db->get_compiled_insert()`_.
Derek Jones8ede1a22011-10-05 13:34:52 -0500964
965***************
966Method Chaining
967***************
968
969Method chaining allows you to simplify your syntax by connecting
970multiple functions. Consider this example::
971
972 $query = $this->db->select('title')
Timothy Warrene464b392012-03-13 14:09:31 -0400973 ->where('id', $id)
974 ->limit(10, 20)
975 ->get('mytable');
Derek Jones8ede1a22011-10-05 13:34:52 -0500976
Derek Jones8ede1a22011-10-05 13:34:52 -0500977.. _ar-caching:
978
979*********************
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000980Query Builder Caching
Derek Jones8ede1a22011-10-05 13:34:52 -0500981*********************
982
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000983While not "true" caching, Query Builder enables you to save (or "cache")
Derek Jones8ede1a22011-10-05 13:34:52 -0500984certain parts of your queries for reuse at a later point in your
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000985script's execution. Normally, when an Query Builder call is completed,
Derek Jones8ede1a22011-10-05 13:34:52 -0500986all stored information is reset for the next call. With caching, you can
987prevent this reset, and reuse information easily.
988
989Cached calls are cumulative. If you make 2 cached select() calls, and
990then 2 uncached select() calls, this will result in 4 select() calls.
991There are three Caching functions available:
992
993$this->db->start_cache()
994========================
995
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000996This function must be called to begin caching. All Query Builder queries
Derek Jones8ede1a22011-10-05 13:34:52 -0500997of the correct type (see below for supported queries) are stored for
998later use.
999
1000$this->db->stop_cache()
1001=======================
1002
1003This function can be called to stop caching.
1004
1005$this->db->flush_cache()
1006========================
1007
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001008This function deletes all items from the Query Builder cache.
Derek Jones8ede1a22011-10-05 13:34:52 -05001009
1010Here's a usage example::
1011
1012 $this->db->start_cache();
1013 $this->db->select('field1');
1014 $this->db->stop_cache();
1015 $this->db->get('tablename');
1016 //Generates: SELECT `field1` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001017
Derek Jones8ede1a22011-10-05 13:34:52 -05001018 $this->db->select('field2');
1019 $this->db->get('tablename');
1020 //Generates: SELECT `field1`, `field2` FROM (`tablename`)
WanWizard7219c072011-12-28 14:09:05 +01001021
Derek Jones8ede1a22011-10-05 13:34:52 -05001022 $this->db->flush_cache();
1023 $this->db->select('field2');
1024 $this->db->get('tablename');
1025 //Generates: SELECT `field2` FROM (`tablename`)
1026
1027
1028.. note:: The following statements can be cached: select, from, join,
1029 where, like, group_by, having, order_by, set
1030
1031
Greg Akerffd24a42011-12-25 22:27:59 -06001032$this->db->reset_query()
1033========================
Kyle Farris48d8fb62011-10-14 17:59:49 -03001034
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001035Resetting Query Builder allows you to start fresh with your query without
WanWizard7219c072011-12-28 14:09:05 +01001036executing it first using a method like $this->db->get() or $this->db->insert().
1037Just like the methods that execute a query, this will *not* reset items you've
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001038cached using `Query Builder Caching`_.
Kyle Farris48d8fb62011-10-14 17:59:49 -03001039
Jamie Rumbelow7efad202012-02-19 12:37:00 +00001040This is useful in situations where you are using Query Builder to generate SQL
WanWizard7219c072011-12-28 14:09:05 +01001041(ex. ``$this->db->get_compiled_select()``) but then choose to, for instance,
Kyle Farris48d8fb62011-10-14 17:59:49 -03001042run the query::
1043
1044 // Note that the second parameter of the get_compiled_select method is FALSE
1045 $sql = $this->db->select(array('field1','field2'))
1046 ->where('field3',5)
1047 ->get_compiled_select('mytable', FALSE);
1048
1049 // ...
1050 // Do something crazy with the SQL code... like add it to a cron script for
1051 // later execution or something...
1052 // ...
1053
1054 $data = $this->db->get()->result_array();
1055
1056 // Would execute and return an array of results of the following query:
1057 // SELECT field1, field1 from mytable where field3 = 5;