Autor Zpráva
atomn-adam
Profil *
Ahoj všichni,

jsem celkem novej v objektovym PHP a stavim si vlastní MVC appku, když jsem narazil na problém.
můj předchozí přístup k SQL dotazům byl totiž asi buď špatnej, nebo jenom neefektivní. ukážu to na příkladu.

chci vybrat všechny uživatele z databázové tabulky users, a pak spočítat pomocí jejich id jejich příspěvky v diskusi z tabulky diskuse, s tím že si výsledky uložím do pole a poté je vypíšu v seznamu od nejvíce příspěvků "Adam, 71 příspěvků. Eva, 55 příspěvků", atp. jednoduchý, že?

můj doteď přístup:

dotaz(SELECT * FROM users)
while(data=dotaz->fetch_array)
{
     kolik(SELECT * FROM diskuse WHERE id=data[id])->num_rows
     pole[i]=data[jmeno].' '.kolik.' příspěvků'
}

rozumíme? prostě jsem využil dva dotazy s tím, že tomu vnitřnímu jsem předal argument id současného uživatele.

to je teď ale docela problém, protože když v MVC viewu například "index" vypisuji toto, nevím jak předat modelu argument, že. teď to vypadá nějak takhle:

foreach(this->uzivatele as uzivatel)
{
     this->kolikDiskuse(uzivatel[id])
     pole..blabla.
}

a tenhle přístup logicky nejde použít, jelikož nelze z viewu do controlleru/modelu zpátky házet data, nebo ne? alespoň tak to logicky chápu.

tak mě napadlo, že se to všechno musí nějak uvařit už v controlleru/modelu, ale přemýšlel jsem nad tím, jak, a nenašel jsem řešení. bojím se toho, že špatně používám dotazy a měl bych se na výsledek dostat přes nějaký UNION atp., ale třeba to jde i jinak.

budu rád za každý tip a chápejte, jsem v PHP objektech a MVC celkem rookie. a díky moc předem, vývojářenstvo.

adam

Moderátor Alphard: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Alphard
Profil
Vaše ukázka působí, jako byste se držel zásady jeden sql dotaz na jednu metodu, což je samozřejmě blbost. První kód by prostě tvořil jednu metodu, která by vracela pole pole. V zájmu obecnosti by nemusela obsahovat konkrétní string, ale vícerozměrné pole, které se zformátuje ve view.

Konkrétní případ by šel samozřejmě řešit spojením druhé tabulky a groupnutím podle uživatele
select *, count(*) from users u left join diskuse d on u.id = d.id(??) group by u.id

Celkově je tohle poměrně problematické, např. zajištění filtrování uživatelů, odlišné řazení, stránkování apod. Ideálně by se měly použít fasády nebo jiné interfacy na "vyšší úrovni", ale já si teda často z lenosti vrátím do controleru objekt dibi fluent a upravím do požadované podoby.
atomn-adam
Profil *
Alphard: jo, tak nějak jsem to čekal. Díky moc, jdu se pořádně naučit složenné dotazy..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: