MVC paradox – problém s informacemi z jiných tabulek
- nanuqcz
- Člen | 822
Ahoj,
zkouším teď podle článku MVC paradox a jak
jej řešit udělat jednoduchý výpis článků.
V modelu mám:
function getArticles()
{
$articles = $this->dibi->dataSource("SELECT * FROM `::articles` ORDER BY `order` ASC");
return $articles;
}
teď bych chtěl ale mít u každého článku i všechny tagy, kterými je článek „otagován“. Napadlo mě tedy:
function getArticles()
{
$articles = $this->dibi->dataSource("SELECT * FROM `::articles` ORDER BY `order` ASC");
/* tato část je blbost/ */
foreach ($articles as $id => $article) {
$articles[$id]->tags = $this->dibi->fetchAll("
SELECT t.*
FROM `::tags` t JOIN `::articles_2_tags` at
ON t.`id`=at.`tag_id` AND at.`article_id`=%i", $article->id, "
");
}
/* /tato část je blbost */
return $articles;
}
což samozřejmě nefunguje.
Nějaké nápady? Díky
Editoval xxxObiWan (3. 9. 2011 15:57)
- Filip Procházka
- Moderator | 4668
Proč bys proboha používal datasource s mysql?
public function findArticlesWithTags($offset = 0, $limit = 10)
{
$articles = $this->db->select('*')->from('articles')
->orderBy(array('order' => 'asc'))
->fetchAll($offset, $limit);
$ids = array_map(function ($article) {
return $article->id;
}, $articles);
$tags = $this->db->select('tag')->from('article_tags')
->where('article_id IN %l', $ids)
->fetchAssoc('article_id')
foreach ($articles => $article) {
$article->tags = isset($tags[$article->id]) ? $tags[$article->id] : array();
}
return $articles;
}
Editoval HosipLan (3. 9. 2011 17:29)
- Filip Procházka
- Moderator | 4668
Pokud používáš mysql tak se připravíš o všechen svůj výkon prostým výpisem článků. DibiDataSource je s mysql cesta do pekla.
- nanuqcz
- Člen | 822
Ok, díky za vysvětlení :-)
Šel by tedy pro tento účel použít DibiFluent? Ale tak, abych mohl DibiFluent předávat až do šablony, kde pak pomocí něho budu vypisovat:
{foreach $articles->orderBy('title') as $article}
<h2>{$article->title}</h2>
<p>{!$article->perex}</p>
{/foreach}
- nanuqcz
- Člen | 822
Jan Tvrdík: Díky :-) Tím se ale pořád neřeší můj hlavní problém: Jak do DibiDataSource/DibiFluent dostat i data ze souvisejících tabulek, aniž bych musel DibiDataSource/DibiFluent rušit (metody fetchAll, execute atd už DibiDataSource, ani DibiFluent nevrací).
Zatím se mi v hlavě rýsuje jedno řešení, ale asi budu muset krapet rozšířit Dibi :-/ Raději bych něco více přímého :-)
- Filip Procházka
- Moderator | 4668
Mě především nejde do hlavy, proč se snažíš s dibi dělat něco, na co nebylo stvořeno. Nebylo by lepší použít nástroj, který je dělaný přesně na tohle? http://www.notorm.com
- nanuqcz
- Člen | 822
Nebylo stvořeno? Vždyť David na téma „MVC paradox“ a „Dibi“ napsal celý článek …
Jinak, tady je můj návrh řešení: feature request 1 a feature request 2
- Filip Procházka
- Moderator | 4668
Je rozdíl, pokud píšeš nástroj za konkrétním účelem, nebo jestli to tam programuješ až nakonec.
Dibi je layer nad databází, který tě chrání před SQL injekcí a pomáhá psát SQLka.
Když pominu fakt, že řešením MVC paradoxu je porušení MVC, tak NotORM je na tohle naprosto perfektní nástroj. Dibi na tohle prostě použít nemůžeš.
Srovnej přidávání tagů ke článkům v tom, co jsem napsal já a to, jak se to píše v NotORM. V NotORM je to 4× kratší a naprosto přirozené a ještě více efektivní.
Ztrácíš svůj čas s řešením něčeho, co není potřeba řešit, protože je to už vyřešeno.
Editoval HosipLan (4. 9. 2011 12:50)