Thread View: pl.comp.lang.php
16 messages
16 total messages
Started by jivanmukta
Sat, 11 Jul 2015 17:55
MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Sat, 11 Jul 2015 17:55
Date: Sat, 11 Jul 2015 17:55
6 lines
1719 bytes
1719 bytes
Uczę się PHP5 i CodeIgnitera. Mam pytanie dotyczące wzorca MVC. Czy są sytuacje, gdy jest sens żeby zapytanie SQL znajdowało się w kontrolerze a nie w modelu? Od czego to zależy? Czy np. jeśli model miałby zawierać tylko jedną metodę z jednym zapytaniem, to czy można sobie odpuścić tworzenie modelu i wysłać zapytanie SQL z kontrolera? Np. w CodeIgniterze teoretycznie można załadować w kontrolerze obiekt database:
$this->load->datbase();
i wywołać zapytanie:
$this->db->query('SELECT column FROM table');
Czy są sytuacje, że takie postępowanie jest do przyjęcia?
Byłbym wdzięczny za odpowiedź. Z góry bardzo dziękuję.
Re: MVC: zapytanie SQL z kontrolera
Author: DeZ
Date: Sat, 11 Jul 2015 20:08
Date: Sat, 11 Jul 2015 20:08
8 lines
1316 bytes
1316 bytes
W dniu 11.07.2015 o 19:55, jivanmukta@poczta.onet.pl pisze: > Mam pytanie dotyczące wzorca MVC. Czy są sytuacje, gdy jest sens żeby zapytanie SQL znajdowało się w kontrolerze a nie w modelu? Nie. Chyba, że chcesz mieć "prawie" MVC. A co Ci szkodzi dodać tą jedną klasę modelu z jedną metodą? Twój kod raczej będzie tylko przez to czytelniejszy. DeZ
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 00:37
Date: Sun, 12 Jul 2015 00:37
21 lines
1497 bytes
1497 bytes
Dnia Sat, 11 Jul 2015 10:55:54 -0700 (PDT), jivanmukta@poczta.onet.pl
napisał(a):
> Czy np. jeśli model miałby zawierać tylko jedną metodę z jednym
> zapytaniem, (...)
A co chcesz w taki dziwny sposób zamodelować? Bo to jest zwykła klasa,
która sobie sięga do bazy po jakąś kolekcję, a nie model.
> i wywołać zapytanie:
> $this->db->query('SELECT column FROM table');
> Czy są sytuacje, że takie postępowanie jest do przyjęcia?
A nie prościej użyć query buildera?
Napisz lepiej po prostu co chcesz uzyskać, bo mam wrażenie, że coś chcesz
zrobić kompletnie nie od tej strony co trzeba.
--
Borys Pogoreło
borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Sun, 12 Jul 2015 05:29
Date: Sun, 12 Jul 2015 05:29
5 lines
1954 bytes
1954 bytes
W dniu niedziela, 12 lipca 2015 02:37:44 UTC+2 użytkownik Borys Pogoreło napisał: > Napisz lepiej po prostu co chcesz uzyskać, bo mam wrażenie, że coś chcesz > zrobić kompletnie nie od tej strony co trzeba. Mam kontroler Admin do raportów. We wszystkich akcjach (metodach) używam modelu Announcement_model lub Agencies_model lub Statement_model. Ostatnim raportem jest statystyka (wykres słupkowy), która jest robiona na podstawie zapytania SQL SELECT ... FROM statistics WHERE ... . Nie wiem czy powinienem wydzielać model Statistics_model z funkcją getStatistics() zadającą to zapytanie. A może powienienem umieścić funkcję w bibliotece?
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Sun, 12 Jul 2015 09:10
Date: Sun, 12 Jul 2015 09:10
1 lines
1625 bytes
1625 bytes
Mam jeszcze jedno pytanie. Czy jeśli w kontrolerze używam dwóch modeli i każdy z nich ładuje obiekt database to czy przypadkiem nie powstaną dwa połączenia do bazy? Jeśli tak, to czy żeby tego uniknąć należy ładować database tylko w kontrolerze?
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 16:01
Date: Sun, 12 Jul 2015 16:01
17 lines
1548 bytes
1548 bytes
Dnia Sat, 11 Jul 2015 22:29:35 -0700 (PDT), jivanmukta@poczta.onet.pl napisał(a): > Nie wiem czy powinienem wydzielać model Statistics_model z funkcją > getStatistics() zadającą to zapytanie. A może powienienem umieścić > funkcję w bibliotece? Jeśli w CI jest coś takiego, to jak najbardziej. To co opisujesz jest jakimś odrębnym narzędziem działającym na zbiorze danych w aplikacji, a nie modelem. Co do połączeń z bazą to prawie na pewno masz jedno przez całe wykonanie skryptu. A przynajmniej każdy rozsądny framework powinien tak działać. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Sun, 12 Jul 2015 16:57
Date: Sun, 12 Jul 2015 16:57
1 lines
1680 bytes
1680 bytes
Pan mi dużo pomaga na grupie. Chciałbym Panu podarować książkę. Jeśli Pan chce, proszę sobie wybrać jedną z księgarni http://ke.pl/ (często tam bywam) i prosiłbym o email z adresem pod który mam wysłać książkę pocztą.
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:03
Date: Sun, 12 Jul 2015 19:03
15 lines
1489 bytes
1489 bytes
Dnia Sun, 12 Jul 2015 09:57:06 -0700 (PDT), jivanmukta@poczta.onet.pl napisał(a): > Pan mi dużo pomaga na grupie. Chciałbym Panu podarować książkę. Jeśli Pan > chce, proszę sobie wybrać jedną z księgarni http://ke.pl/ (często tam > bywam) i prosiłbym o email z adresem pod który mam wysłać książkę > pocztą. Haha dzięki :) Odezwę się na priv. Btw, w usenecie nie ma co sobie "panować". -- Borys Pogoreło borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Tue, 14 Jul 2015 09:47
Date: Tue, 14 Jul 2015 09:47
1 lines
1689 bytes
1689 bytes
Czy jeśli w kontrolerze używam metody modelu to dane od użytkownika (w CodeIgniterze funkcja $this->input->post('field_name')) powinienem przekazywać jako paramter to meodty modelu, czy też mogę użyć $this->input->post('field_name') w metodzie modelu? Tak, żeby było MVC...
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 15:13
Date: Tue, 14 Jul 2015 15:13
19 lines
1831 bytes
1831 bytes
Dnia Tue, 14 Jul 2015 02:47:22 -0700 (PDT), jivanmukta@poczta.onet.pl
napisał(a):
> Czy jeśli w kontrolerze używam metody modelu to dane od użytkownika (w
> CodeIgniterze funkcja $this->input->post('field_name')) powinienem
> przekazywać jako paramter to meodty modelu, czy też mogę użyć
> $this->input->post('field_name') w metodzie modelu? Tak, żeby było
> MVC...
Nie, modelu kompletnie nie powinno interesować pochodzenie tych wartości,
on ma reprezentować tylko jakąś koncepcję, w MVC zmiana modelu jest
zadaniem kontrolera. A Ty chcesz w nim umieścić właśnie logikę kontrolera,
do tego jeszcze silnie powiązaną ze źródłem danych (HTTP POST) - co w
przypadku użycia modelu w aplikacji CLI? Bo o testach nawet nie
wspominam...
--
Borys Pogoreło
borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Wed, 15 Jul 2015 13:39
Date: Wed, 15 Jul 2015 13:39
3 lines
1764 bytes
1764 bytes
Poprawiłem kod. Jutro będę wyjątkowo w Warszawie (teraz jestem poza), więc jak byś się zdecydował z tą książką dzisiaj, to byłoby mi bardzo wygodnie...
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Fri, 24 Jul 2015 13:39
Date: Fri, 24 Jul 2015 13:39
76 lines
5271 bytes
5271 bytes
Mam ostatnie pytanie dotyczace MVC. Gdzie mam umieszczać obsługę błędów operacji bazodanowych? Aktualnie mam bibliotekę Common:
class Common {
private $ci;
public function __construct() {
$this->ci =& get_instance();
}
public function error($msg) {
$this->ci->mylog->logError($msg);
show_error($msg);
}
...
}
Błędy obsługuję tak: kontroler zawiera:
public function modify_agency() {
$agencyId = intval($this->input->post('agency_id'));
$this->load->model('Agencies_model');
if (!$this->Agencies_model->modifyAgency($agencyId,
trim($this->input->post('name')),
trim($this->input->post('email')),
trim($this->input->post('www')),
trim($this->input->post('mobile1')),
trim($this->input->post('mobile2')),
trim($this->input->post('phone1')),
trim($this->input->post('phone2')),
trim($this->input->post('contact_person')),
trim($this->input->post('town')),
trim($this->input->post('remarks')))) {
$this->common->error(ERRMSG_DATABASE_OPERATION_FAILED);
}
redirect('/admin/report/agencies');
}
natomiast model zawiera:
public function modifyAgency($agencyId, $name, $email, $www, $mobile1, $mobile2, $phone1, $phone2, $contactPerson, $town, $remarks) {
$ok = TRUE;
if (preg_match('/' . EMAIL_REGEXP . '/i', $email, $matches) > 0) {
$email = $matches[0];
} else {
$ok = FALSE;
}
$ok = ($ok && (is_empty($mobile1) || $this->ci->common->isValidMobile($mobile1)));
$ok = ($ok && (is_empty($mobile2) || $this->ci->common->isValidMobile($mobile2)));
$ok = ($ok && (is_empty($phone1) || $this->ci->common->isValidPhone($phone1)));
$ok = ($ok && (is_empty($phone2) || $this->ci->common->isValidPhone($phone2)));
if (!$ok) {
$this->ci->common->error(ERRMSG_INVALID_AGENCY_DATA);
}
$www = (is_empty($www) ? NULL : $www);
$mobile1 = (is_empty($mobile1) ? NULL : $mobile1);
$mobile2 = (is_empty($mobile2) ? NULL : $mobile2);
$phone1 = (is_empty($phone1) ? NULL : $phone1);
$phone2 = (is_empty($phone2) ? NULL : $phone2);
$contactPerson = (is_empty($contactPerson) ? NULL : $contactPerson);
$town = (is_empty($town) ? NULL : $town);
$remarks = (is_empty($remarks) ? NULL : $remarks);
$sql = 'UPDATE agencies SET ' .
'name = ' . $this->ci->common->convertToDb($name) . ', ' .
'email = ' . $this->ci->common->convertToDb($email) . ', ' .
'www = ' . $this->ci->common->convertToDb($www) . ', ' .
'mobile1 = ' . $this->ci->common->convertToDb($mobile1) . ', ' .
'mobile2 = ' . $this->ci->common->convertToDb($mobile2) . ', ' .
'phone1 = ' . $this->ci->common->convertToDb($phone1) . ', ' .
'phone2 = ' . $this->ci->common->convertToDb($phone2) . ', ' .
'contact_person = ' . $this->ci->common->convertToDb($contactPerson) . ', ' .
'town = ' . $this->ci->common->convertToDb($town) . ', ' .
'remarks = ' . $this->ci->common->convertToDb($remarks) .
" WHERE agency_id = $agencyId";
$this->db->query($sql);
return $this->db->affected_rows() == 1;
}
Czy tak jest dobrze?
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Sat, 25 Jul 2015 15:31
Date: Sat, 25 Jul 2015 15:31
15 lines
1738 bytes
1738 bytes
Dnia Fri, 24 Jul 2015 06:39:09 -0700 (PDT), jivanmukta@poczta.onet.pl napisał(a): > Mam ostatnie pytanie dotyczace MVC. Gdzie mam umieszczać obsługę błędów > operacji bazodanowych? To zależy przede wszystkim od tego, czy te błędy mogą być akceptowalne, czy powinno się wszystko wysypać z wielkim czerwonym komunikatem. Przerób to sobie na wyjątki, wtedy będziesz mógł je łapać w miejscu wystąpienia lub gdzieś wyżej. Poza tym logowanie samego "ERRMSG_DATABASE_OPERATION_FAILED" to trochę mało, skąd weźmiesz choćby komunikat błędu bazy? -- Borys Pogoreło borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: jivanmukta
Date: Tue, 28 Jul 2015 12:28
Date: Tue, 28 Jul 2015 12:28
26 lines
2576 bytes
2576 bytes
Przyjąłem zasadę, że w przypadku prostych, pojedynczych instrukcji SQL, używam kodów błędów (najczęściej TRUE/FALSE), np.:
public function acceptAgencies(array $agencies, $day) {
$this->db->query('UPDATE agencies SET date_entered = ' . $this->ci->common->convertToDb($day) . ' ' .
' WHERE agency_id IN (' . implode(', ', $agencies) . ')');
return $this->db->affected_rows() == count($agencies);
}
natomiast w przypadku złożonych operacji objętych transakcjami, używam wyjątków:
// wczytaj listę agencji:
public function import($fileName, array $estateTypes) {
$this->db->trans_start();
try {
// wczytaj listę:
$this->importFromFile(IMPORT_DIR . DIRECTORY_SEPARATOR . $fileName);
$this->insertIntoDb($estateTypes);
} catch (Exception $e) {
$this->db->trans_rollback();
$this->common->error($e->getMessage());
}
$this->db->trans_complete();
return $this->db->trans_status();
}
Czy to ma sens?
Re: MVC: zapytanie SQL z kontrolera
Author: Borys Pogoreło
Date: Wed, 29 Jul 2015 18:08
Date: Wed, 29 Jul 2015 18:08
14 lines
1700 bytes
1700 bytes
Dnia Tue, 28 Jul 2015 05:28:36 -0700 (PDT), jivanmukta@poczta.onet.pl napisał(a): > Przyjąłem zasadę, że w przypadku prostych, pojedynczych instrukcji SQL, używam kodów błędów (najczęściej TRUE/FALSE), np.: > (...) > Czy to ma sens? Nie ma, bo w żaden sposób wtedy nie odróżnisz błędów od siebie, by móc odpowiednio zareagować. I niepotrzebnie sobie komplikujesz życie pisząc kod na dwa sposoby. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: MVC: zapytanie SQL z kontrolera
Author: grzessiek
Date: Sat, 01 Aug 2015 15:59
Date: Sat, 01 Aug 2015 15:59
8 lines
1207 bytes
1207 bytes
W dniu 2015-07-11 o 19:55, jivanmukta@poczta.onet.pl pisze: > Mam pytanie dotyczące wzorca MVC.Czy są sytuacje, gdy jest sens żeby zapytanie SQL znajdowało się w kontrolerze a nie w modelu? Controllera nie powinno interesować skąd pochodzą i gdzie zapisywane są dane, tym zajmuje się Model. g.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads