MVC operacje na wynikach zapytania w modelu czy kontrolerze

0

Witam
Piszę sobie prostą aplikację w Codeigniterze. Potrzebuje z bazy danych uzyskać informację, czy dane pole ma wartość yes czy no. Mam takie zapytanie:

public function is_rented($data)
    {
        $sql="SELECT Rented FROM Cars WHERE CarID=?";
        $query=$this->db->query($sql,array($data['car_id']));
        return $query;
    }

i w $query mam to co zwróciła baza. Teraz czy powinienem to przekazać z powrotem do kontrolera i tam użyć takiego kodu:

 
$result=$this->car_model->is_rented($data);
$row=$result->row();
$rented=$row->Rented;

Czy może powinienem to zrobić w modelu i wyglądałoby to tak:
model:

public function is_rented($data)
    {
        $sql="SELECT Rented FROM Cars WHERE CarID=?";
        $query=$this->db->query($sql,array($data['car_id']));
        $row=$query->row();
        return $row->Rented;
    }

kontroler

 
$rented=$this->car_model->is_rented($data);

Jak powinno się takie rzeczy robić zgodnie ze wzorcem MVC?

1

W ogólnym przypadku powinieneś wczytać cały model i sprawdzić to konkretne pole przez getter.
Nie zawsze ma to jednak sens (zwłaszcza gdy zależy nam na pamięci, transferze lub wydajności) - w takim wypadku dopuszczalne jest utworzenie metod pomocniczych, takich jak ta Twoja.

Taka metoda pomocnicza powinna przyjmować id obiektu (nie tablicę zawierającą id, tylko samo id) i zwracać od razu wartość danego pola, bez dodatkowych opakowań.

Atoli w XXI wieku myślę, że bez problemu możesz sobie pozwolić na wczytanie całego modelu do pamięci i operowanie na nim.

0

Czyli generalnie powinienem zrobić albo tak
model

public function is_rented($)
{
    $sql='SELECT * FROM Cars WHERE CarID='.$carID;
    return $this->db->query($sql);
}

i wtedy w kontrolerze wyciągnąć to czego potrzebuje

albo tak:

public function is_rented($carID)
    {
        $sql="SELECT Rented FROM Cars WHERE CarID=".carID;
        $query=$this->db->query($sql);
        $row=$query->row();
        return $row->Rented;
    }

tylko że raczej powinienm używać tej pierwszej wersji, dobrze zrozumiałem?
@Patryk27

1

Nie, chyba nie do końca rozumiesz ideę modelu.
Albo robisz getModelById, które zwraca model z wypełnionymi polami, albo robisz Twoją opcję drugą z wyższego posta (ona jest ok). Nie rób niczego o nazwie is_rented, które zwraca wszystkie pola.

0

To jest CI, tutaj to nie działa to tak fajnie jak mówisz, to nie laravel/symphony ;)

0

Dzięki za odpowiedź, już zrozumiałem:)

A jeszcze przy okazji, piszę sobie stronę do wypożyczania aut i mam 2 tabele w bazie: cars(zawiera kolumne rented(wartosci yes, no) ) i orders(zawiera kolumny rent_start, rent_finish zawierające datę rozpoczęcia i zakończenia wypożyczenia).

W tabeli cars kolumna rented zawiera informacje czy samochód jest obecnie wypożyczony czy nie. Samochody można wypożyczać tylko na pełne dni, więc planowałem zrobić tak, że bęedzie skrypt uruchamiany każdego dnia o godzinie 0:00 i będzie sprawdzał dla każdego auta, które ma aktualnie rented='yes' czy jego okres wypożyczenia w tabeli orders już się skończył, jeżeli tak to będzie zmieniał wartość rented na 'no'.
Tylko nie wiem czy cron to dobry wybór, czy może lepiej przy próbie wypożyczenia danego auta sprawdzać czy obecna data mieści się w przedziale na który auto zostało wypożyczone i wtedy zwracać info.
Który sposób będzie lepszy? Czy może jeszcze inaczej to rozwiązać?

1

Cron jest dobrą opcją w tym przypadku.

czy może lepiej przy próbie wypożyczenia danego auta sprawdzać czy obecna data mieści się w przedziale na który auto zostało wypożyczone i wtedy zwracać info.
A co z wyszukiwarką samochodów? Też musiałaby brać pod uwagę okres wypożyczenia samochodu, co de facto nie powinno w ogóle ją obchodzić. Etc. etc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1