🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#231077
Author: jivanmukta
Date: Sat, 11 Jul 2015 17:55
6 lines
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
#231078
Author: DeZ
Date: Sat, 11 Jul 2015 20:08
8 lines
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
#231079
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 00:37
21 lines
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
#231080
Author: jivanmukta
Date: Sun, 12 Jul 2015 05:29
5 lines
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
#231081
Author: jivanmukta
Date: Sun, 12 Jul 2015 09:10
1 lines
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
#231082
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 16:01
17 lines
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
#231083
Author: jivanmukta
Date: Sun, 12 Jul 2015 16:57
1 lines
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
#231084
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:03
15 lines
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
#231085
Author: jivanmukta
Date: Tue, 14 Jul 2015 09:47
1 lines
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
#231086
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 15:13
19 lines
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
#231087
Author: jivanmukta
Date: Wed, 15 Jul 2015 13:39
3 lines
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
#231088
Author: jivanmukta
Date: Fri, 24 Jul 2015 13:39
76 lines
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
#231089
Author: Borys Pogoreło
Date: Sat, 25 Jul 2015 15:31
15 lines
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
#231090
Author: jivanmukta
Date: Tue, 28 Jul 2015 12:28
26 lines
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
#231091
Author: Borys Pogoreło
Date: Wed, 29 Jul 2015 18:08
14 lines
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
#231092
Author: grzessiek
Date: Sat, 01 Aug 2015 15:59
8 lines
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