MVC paradox – problém s informacemi z jiných tabulek

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

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
+
0
-

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)

nanuqcz
Člen | 822
+
0
-

HosipLan: Tím se ale připravím o všechny výhody, které jsou uvedené ve výše odkazovaném článku (možnost dodatečného omezování vrácených článků v presenteru, řazení v šabloně atd). To, co mi radíš, jsem více-méně používal doteď.

Filip Procházka
Moderator | 4668
+
0
-

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.

Cifro
Člen | 245
+
0
-
nanuqcz
Člen | 822
+
0
-

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}
Jan Tvrdík
Nette guru | 2595
+
0
-

Lze také použít http://petrp.cz/…ce-pro-mysql.

nanuqcz
Člen | 822
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)