Návrh modelu pro katalog zaznamů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mardon
Člen | 59
+
0
-

Vytvářím si jednoduchý katalog v Nette. Na homepage mam vypsano poslednich x pridanych zaznamu do katalogu coz resim modelelem ServiceModel a funkcí

<?php
public function getService($order = NULL, $where = NULL, $limit = NULL, $offset = NULL) {
        return $this->db->fetchAll('SELECT service.id, service.name, service.description,service.phone, service.adress, service.seo, category.name as id_cat,service.url,service.email,service.date FROM [service], [category] ',
                '%if', isset($where), "WHERE service.id_cat = category.id AND %and", isset($where) ? $where : array(), "%end",
                "%if", isset($order), "ORDER BY %by", $order, "%end",
                "%if", isset($limit), "LIMIT %i %end", $limit,
                "%if", isset($offset), "OFFSET %i %end", $order
        );
    }
?>

pak po kliknuti na kategori bych rada vypsala zaznamy zarazene do teto kategorie, pricemz vypis obsahuje tytez polozky jako vypis na homepage, tady to resim CategoryModel a funkci

<?php
public function getServicecat($id) {
        return $this->db->fetchAll('SELECT id, name, url, email, date, seo, phone, adress, description FROM [service] WHERE id_cat='.$id.' ORDER BY [date] DESC');
    }
?>

obě fce vlastně mají podobný výstup. Šlo by to navrhnout lépe, abych používala jen jednu funkci?

Editoval mardon (7. 9. 2010 8:45)

theo
Člen | 57
+
0
-

Ten SQL dotaz je zbytečně komplikovaný (ale taky jsem to tak nějakou dobu psal, než jsem si pořádně přečetl dokumentaci k dibi :). Za předpokladu, že $order a $where pojmeš jako pole (například $order = array('klic' => dibi::ASC), $where = array('klic' => 'hodnota'), nebo $where = array(array('klic LIKE %s', $hodnota))) můžeš zápis celého dotazu silně zjednodušit na něco jako:

<?php
return $this->db->fetchAll("SELECT s.*, category.name as id_cat FROM [service] s, [category] c
WHERE s.id_cat = c.id AND %and", $where, "
ORDER BY %by", $order, "
%lmt ", $limit, " %ofs", $offset
);
?>

Což je zároveň odpovědí na Tvou otázku, protože takto postavenému dotazu lze $where nastavit jednou jako array('id' => $id) a podruhé jako array('cat_id' => $cat_id), nebo cokoliv podobného (když bude omezení víc, budou spojené ANDem). Do kterého modelu si to umístíš už nechám na Tvém uvážení…

PS: Rožnov zdraví Valmez ;)

Editoval theo (7. 9. 2010 10:54)

Mesiah
Člen | 240
+
0
-

osobně to řeším pomocí továrničky…

<?php
private function sqlFactory()
{
	return dibi::select('*')->from('table');
}

public function getRecords()
{
	return $this->sqlFactory();
}

public function getRecord($id)
{
	return $this->sqlFactory()->where('[id] = %i', $id);
}
?>

a v akci prezenteru tento dotaz více specifikuji pomocí fluent interface, přidám podmínky, řazení a tak…