Návrh modelu pro katalog zaznamů
- mardon
- Člen | 59
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
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
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…