This repository was archived by the owner on Jun 12, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgeneral.html
More file actions
316 lines (294 loc) · 12.6 KB
/
general.html
File metadata and controls
316 lines (294 loc) · 12.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tematy ogólne | codeigniter-base-model</title>
<style type='text/css' media='all'>@import url('./userguide.css');</style>
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />
<meta http-equiv='expires' content='-1' />
<meta http-equiv= 'pragma' content='no-cache' />
<meta name='robots' content='all' />
<script src="js/jquery.min.js"></script>
<script src="js/nav.js"></script>
</head>
<body>
<!-- START NAVIGATION -->
<div id="nav"><div id="nav_inner">
<script>
create_menu('null');
</script>
</div></div>
<div id="nav2"><a name="top"> </a></div>
<div id="masthead">
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td><h1>Dokumentacja</h1></td>
<td id="breadcrumb_right"></td>
</tr>
</table>
</div>
<!-- END NAVIGATION -->
<!-- START BREADCRUMB -->
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td id="breadcrumb">
<a href="https://github.com/jamierumbelow/codeigniter-base-model">codeigniter-base-model</a> ›
<a href="index.html">Dokumentacja</a> ›
Tematy ogólne
</td>
</tr>
</table>
<!-- END BREADCRUMB -->
<br clear="all" />
<!-- START CONTENT -->
<div id="content">
<h1>codeigniter-base-model</h1>
<h2>Tematy ogólne</h2>
<a name="naming"></a>
<h3>Nazewnictwo</h3>
<p>Klasa sama rozpoznaje nazwę tabeli poprzez utowrzenie formy mnogiej od nazwy klasy modelu.
<p>W poniższym przykładzie:
<pre>
class Post_model extends MY_Model{ }
</pre>
<p>nazwą tabeli będzie <b>posts</b>. Działa to także z modelami z _m w nazwie:
<pre>
class Book_m extends MY_Model{ }
</pre>
<p>W tym przypadku nazwą tabeli będzie <b>books</b>.
<p>Jeśli chcesz by tabela nazywała się inaczej możesz określić to w klasie modelu za pomocą zmiennej <var>$_table</var>:
<pre>
class Post_model extends MY_Model
{
public $_table = 'blogposts';
}
</pre>
<p>Niektóre funkcje CRUD przyjmują, że w tablicy kolumna zawierająca klucze główne nazywa się <b>id</b>. Możesz zmienić to zachowanie deklarując <var>$primary_key</var> wewnątrz klasy swojego modelu:
<pre>
class Post_model extends MY_Model
{
public $primary_key = 'post_id';
}
</pre>
<a name="relations"></a>
<h3>Obsługa relacji</h3>
<p>MY_Model wspiera obsługę podstawowych relacji <i>belongs_to(należy do)</i> i <i>has_many(posiada wiele)</i>. Te relacje można łatwo zdefiniować:
<pre>
class Post_model extends MY_Model
{
public $belongs_to = array( 'author' );
public $has_many = array( 'comments' );
}
</pre>
<p>Można przyjąć,że w klasie z API-kompatybilnym MY_model zdefiniowaliśmy pożądaną relację. Domyślnie będzie to więc model <b>relacja_model</b>. Poniższy przykład odnosi się do dwóch innych modeli:
<pre>
class Author_model extends MY_Model { }
class Comment_model extends MY_Model { }
</pre>
<p>Jeśli chcesz zmienić nazwy modeli, do których odnosi się relacja możesz podać dodatkowe parametry:
<pre>
class Post_model extends MY_Model
{
public $belongs_to = array( 'author' => array( 'model' => 'author_m' ) );
public $has_many = array( 'comments' => array( 'model' => 'model_comments' ) );
}
</pre>
<p>Gdy już określisz relacje w modelach, możesz wszystko połączyć w całość za pomocą metody with();
<pre>
$post = $this->post_model->with('author')
->with('comments')
->get(1);
</pre>
<p>Dane z połączonych ze sobą tabel zostaną dodane do wartości zwróconej przez <b>get()</b>.
<pre>
echo $post->author->name;
foreach ($post->comments as $comment)
{
echo $comment->$message;
}
</pre>
<p>Powstaną oddzielne zapytania, więc gdy szybkość jest ważna, zalecane są oddzielne zapytania JOIN i SELECT.
<p>Można także skonfigurować klucze główne inaczej. Tak by relacja dla <i>belongs_to</i> następowała w tym samym obiekcie, nie obcym. Pseudokod:
<pre>
SELECT * FROM authors WHERE id = $post->author_id
</pre>
...a tutaj dla <i>has_many</i>:
<pre>
SELECT * FROM comments WHERE post_id = $post->id
</pre>
<p>By zmienić użycie <b>klucza głównego</b> można użyć następującej konfiguracji:
<pre>
class Post_model extends MY_Model
{
public $belongs_to = array( 'author' => array( 'primary_key' => 'post_author_id' ) );
public $has_many = array( 'comments' => array( 'primary_key' => 'parent_post_id' ) );
}
</pre>
<a name="callbacks"></a>
<h3>Obserwatory i funckje zwrotne</h3>
<p>Wiele razy możesz potrzebować zmienić swoje dane przed dodaniem lub przed ich pobraniem. Może to być dodanie daty i godziny, sprawdzenie relacji lub skasowanie zależnych rekordów. Standardy przy używaniu wzorca MVC sugerują, że tego typu czynności powinny dziać się w modelu. W celu podążenia za tym MY_Model zawiera serię funkcji zwrotnych i obserwatorów, metod, które są wywoływane w odpowiednim momencie.
<p>Oto ich pełna lista:
<ul>
<li>$before_create</li>
<li>$after_create</li>
<li>$before_update</li>
<li>$after_update</li>
<li>$before_get</li>
<li>$after_get</li>
<li>$before_delete</li>
<li>$after_delete</li>
</ul>
<p>Instancje tych zmiennych są zazwyczaj definiowane na poziomie klasy. Są to tablice zawierające metody klasy modelu uruchamiane w określonych przypadkach. Na przykład:
<pre>
class Book_model extends MY_Model
{
public $before_create = array( 'timestamps' );
protected function timestamps($book)
{
$book['created_at'] = $book['updated_at'] = date('Y-m-d H:i:s');
return $book;
}
}
</pre>
<p class="important">Pamiętaj by zawsze zawsze zawsze zwrócić <var>$row</var> obiektu, który został przekazany do funkcji. Każdy obserwator nadpisuje dane swojego poprzednika w kolejności chronologicznej, czyli po kolei, tak jak umieszczone są obserwatory.
<p>Obserwatory mogą także przyjmować paramtery w swoich nazwach, tak jak biblioteka Codeigniter Form Validation. Te parametry są później dostępne w zmiennej <var>$this->callback_parameters</var>:
<pre>
public $before_create = array( 'data_process(name)' );
public $before_update = array( 'data_process(date)' );
protected function data_process($row)
{
$row[$this->callback_parameters[0]] = $this->_process($row[$this->callback_parameters[0]]);
return $row;
}
</pre>
<a name="callbacks_builtin"></a>
<h3>Wbudowane obserwatory</h3>
<p><b>MY_Model</b> zawiera kilka wbudowanych obserwatorów, które autor uznał za często wykorzystywane w swoich modelach.
<p>Znaczniki czasu (kompatybline z MySql) 'created_at' i 'updated_at' są dostępne od razu:
<pre>
class Post_model extends MY_Model
{
public $before_create = array( 'created_at', 'updated_at' );
public $before_update = array( 'updated_at' );
}
</pre>
<p><b>MY_Model</b> zawiera także obserwatory, które serializują i odczytują z powrotem natywne obiekty PHP. Ta funkcja pozwala na przechowywanie skomplikowanych struktur takich, jak tablice i obiekty i automatycznie serializować je w tle. Obserwatory 'serialize' i 'unserialize' uruchamia się dodając nazwę kolumny jako parametr:
<pre>
class Event_model extends MY_Model
{
public $before_create = array( 'serialize(seat_types)' );
public $before_update = array( 'serialize(seat_types)' );
public $after_get = array( 'unserialize(seat_types)' );
}
</pre>
<a name="validation"></a>
<h3>Walidacja</h3>
<p>MY_Model używa wbudowanej klasy form validation w celu zweryfikowania danych przed dodaniem.
<p>Walidację można uruchomić poprzez ustanownienie zmiennej '$validate' z zestawami reguł w formie tablic, tak jak w klasie codeigniter'a:
<pre>
class User_model extends MY_Model
{
public $validate = array(
array( 'field' => 'email',
'label' => 'email',
'rules' => 'required|valid_email|is_unique[users.email]' ),
array( 'field' => 'password',
'label' => 'password',
'rules' => 'required' ),
array( 'field' => 'password_confirmation',
'label' => 'confirm password',
'rules' => 'required|matches[password]' ),
);
}
</pre>
<p>Wszystko, co działa w bibliotece 'form validation' może być wykorzystane także tutaj. Aby dowiedzieć się więcej na temat reguł należy przeczytać <a href="http://podrecznik.codeigniter.org.pl/libraries/form_validation.html#rulereference">odpowiedni rozdział</a> z podręcznika CI.
<p>Z taką ustanowioną tablicą zasad każde dodanie lub poprawienie będzie sprawdzało poprawność danych przed wykonaniem zapytania. <b>W przeciwieństwie do biblioteki form validation CI, MY_Model nie sprawdza danych typu POST, a raczej dane przekazywane bezpośrednio do modelu.</b>
<p> Walidację można ominąć za pomocą metody <a href="utilities.html#skip_validation">skip_validation()</a>.
<a name="protected"></a>
<h3>Zabezpieczone atrybuty</h3>
<p>Dodawanie danych bezpośrednio z formularza nawet mimo podlegania walidacji może być niebezpieczne, każdy atrybut modelu może ulegać modyfikacji, włącznie z parametrem ID.
<p>Aby zpobiec podobnym wydarzeniom MY_Model wspiera zastrzeżone atrybuty. To dane w kolumnach, które nie mogą być modyfikowane.
<p>Aby włączyć zabezpieczone atrybuty, należy dodać do modelu tablicę '$protected_attributes':
<pre>
class Post_model extends MY_Model
{
public $protected_attributes = array( 'id', 'hash' );
}
</pre>
<p>Od teraz przy każdym dodawaniu lub poprawianiu danych, podane zmienne będą automatycznie usuwane z tablicy danych:
<pre>
$this->post_model->insert(array(
'id' => 2,
'hash' => 'aqe3fwrga23fw243fWE',
'title' => 'A new post'
));
// SQL: INSERT INTO posts (title) VALUES ('A new post')
</pre>
<a name="array_vs_objects"></a>
<h3>Tablice vs obiekty</h3>
<p>Domyślnie MY_Model zwraca obiekt używając metod Codeigniter'a row() i reslut(). Jeśli jednak chcesz zwrócić tablicę a nie obiekt, istnieje kilka sposobów, aby tego dokonać.
<p>Jeśli chcesz, aby wszystkie twoje zapytania używały metod zwracających tablicę możesz ustawić w modelu zmienną '$return_type' jako 'array'.
<pre>
class Book_model extends MY_Model
{
protected $return_type = 'array';
}
</pre>
<p>
Jeśli chcesz zmienić rodzaj zwracanych danych tylko w następnym zapytaniu, istnieją dwie metody, którymi możesz się posłużć:
<pre>
$this->book_model->as_array()
->get(1);
$this->book_model->as_object()
->get_by('column', 'value');
</pre>
</p>
<a name="soft_delete"></a>
<h3>Miękkie kasowanie</h3>
<p>Domyślnie mechanizm kasowania działa za pomocą funckji delete z języka SQL. Jednak istnieje prawdopodobieństwo, że nie chcesz całkowicie usunąć swoich danych, zamiast tego możesz wykonać tzw. 'miękkie kasowanie'.</p>
<p>Jeśli zezwolisz w modelu na miękkie kasowanie, rekord będzie oznaczony jako <i>skasowany</i> i pozostanie w bazie.</p>
<p>Oto przykład modelu:</p>
<pre>
class Book_model extends MY_Model { }
</pre>
<p>Możemy uruchomić opcję miękkiego kasowania poprzez dodanie klucza $this->soft_delete:</p>
<pre>
class Book_model extends MY_Model
{
protected $soft_delete=TRUE;
}
</pre>
<p>Domyślnie MY_Model oczekuje zmiennej typu TINYINT lub INT i kolumny o nazwie 'deleted'. Jeśli chcesz, możesz zmienić nazwę kolumny, do której odnosi się model za pomocą $soft_delete_key:</p>
<pre>
class Book_model extends MY_Model
{
protected $soft_delete = TRUE;
protected $soft_delete_key = 'book_deleted_status';
}
</pre>
<p>Od teraz gdy używasz metod zaczynających się od get_ w zapytaniu pojawi się część nakazująca pobieranie rekordów, które nie zostały skasowane: </p>
<pre>
=> $this->book_model->get_by('user_id', 1);
-> SELECT * FROM books WHERE user_id = 1 AND deleted = 0
</pre>
<p>Jeśli jednak chcesz uzyskać wszystkie rekordy włącznie z tymi skasowanymi, możesz użyć funkcji with_deleted():
<pre>
=> $this->book_model->with_deleted()->get_by('user_id', 1);
-> SELECT * FROM books WHERE user_id = 1
</pre>
<p>Możesz równieć uzyskać wyłącznie rekordy skasowane za pomocą funkcji only_deleted():
<pre>
=> $this->book_model->only_deleted()->get_by('user_id', 1);
-> SELECT * FROM books WHERE user_id = 1 AND deleted = 1
</pre>
</div>
<!-- END CONTENT -->
<div id="footer">
<p>
<a href="#top">Top of Page</a> ·
<a href="#">User Guide Home</a>
</p>
<p><a href="http://codeigniter.com">CodeIgniter</a> · Copyright © 2006 - 2014 · <a href="http://ellislab.com/">EllisLab, Inc.</a></p>
</div>
</body>
</html>