Dva dotazy: přepsání sql + placeholder form
- had12
- Člen | 28
Ahoj,
už druhý den sedím, googlím a nevím, a proto bych se na vás rád obrátil
s prosbou o pomoc. Mám zrovna dvě věci k řešení:
Problém č. 1:
Vytvořím si komponentu formulář, který později použiju v latte.
public function createComponentForumNewCommentForm(){
$form = new Form;
$form->addText('name', '')
->setAttribute('placeholder', 'Tvoje jméno');
$form->addText('email', '')
->setAttribute('placeholder', 'Tvůj e-mail')
->setType('email');
$form->addTextarea('message', '')
->setAttribute('placeholder', 'Napiš komentář...');
$form->addSubmit('send', 'Vložit');
return $form;
}
Formulář se vykreslí v šabloně normálně, ale bez atributu placeholder. Když totéž udělám u přihlašovacího formuláře, který se zobrazí v zápatí stránky, placeholder se vykreslí. Nějaký nápad, pro si to takhle vymýšlí?
Problém č. 2:
Nějakou dobu už se peru s tvorbou SQL dotazů přes Nette\Database. Skripty
v jednom kole vrací laděnku, ale stále se mi nedaří nějak proniknout do
tý logiky myšlení (nevěděli byste třeba o linku, kde by to bylo líp
popsaný? Dokumentace je tady hodně chudá…). Proč třeba záleží na
pořadí: $this->connection->table("forum")->select("*")
a
nefunguje $this->connection->select("*")->table("forum")
?
Tohle mi přijde logičtější, když mám na mysli výsledný SQL „SELECT *
FROM forum“, ne?
Pomohli byste mi, prosím, přepsat následující SQL dotaz? Třeba i z toho něco pochopím…
// $type (1/0)
// $limit - aktuální ID stránky mínus jedna
// $offset - počet na stránku
$this->connection->query('
SELECT
parent.id,
parent.authorId,
parent.name,
parent.date,
parent.receiver,
parent.text,
child.id AS c_id,
child.authorId AS c_authorId,
child.name AS c_name,
child.date AS c_date,
child.text AS c_text,
child.parent AS c_parent
FROM
(
SELECT
forum.id AS r_id,
forum.*
FROM forum
WHERE forum.type = ?', $type, ' AND forum.parent IS NULL
ORDER BY forum.date DESC
LIMIT ?, ?
) AS parent
LEFT JOIN forum AS child
ON parent.id = child.parent
ORDER BY
parent.date DESC,
parent.id DESC,
c_date,
c_id
',
($limit * $offset), $offset
);
Zkoušel jsem i něco takovýho:
// model:
$query = $this->connection->query('SELECT * FROM forum WHERE type = ?', $type);
// presenter:
$totalCount = count($query);
// paginator...
$this->template->comments = $query->limit(($id - 1), $perPage)->fetchAll();
ale to mi bohužel hází pořád errory… jako že se pořád snažím přistupovat k metodě, která není součástí ResultSet, atd. Tuším, že problému bude v query() a rád bych se tomu vyhnul, ale pořád se mi nedaří se zakousnout do přepisování sql dotazů do Nette\Database…
Děkuju za vaše cenné rady a omlouvám se, že vás s nimi zatěžuju… ;) Hezký den! :)
- Jan Suchánek
- Člen | 404
@had12:
$typeId = $this->conn->table("forum")->where("type = ?",$id)->fetch()->id;
vytvor si view
SELECT
parent.id parent_id,
parent.authorId parent_authorId,
parent.name parent_name,
parent.date parent_date,
parent.receiver parent_receiver,
parent.text parent_text,
child.id AS chield_id,
child.authorId AS chield_authorId,
child.name AS chield_name,
child.date AS chield_date,
child.text AS chield_text,
child.parent AS chield_parent
FROM forum AS parent
LEFT JOIN forum child ON ON parent.id = child.parent
ORDER BY
parent.date DESC,
parent.id DESC,
child.date,
child.id
nevím píšu to z patra :)
$count = $this->conn->table("forum_view")->where("parent_id = ? AND parent_id IS NOT NULL", $typeId)->select("count(*) count")->fetch()->count;
$this->conn->table("forum_view")->where("parent_id = ? AND parent_id IS NOT NULL", $typeId)->limit($limit, $offest);
Když prostě nevím udělám si view a nehrotím to :)
Editoval jenicek (4. 4. 2014 12:27)
- had12
- Člen | 28
jenicek:
Když prostě nevím udělám si view a nehrotím to :)
To je fakt, tohle řešení mě vůbec nenapadlo, zatím to tak udělám. Je to spíš dočasný řešení, nelze se takhle přece vyhejbat všem dotazům… takhle nebudu mít motivaci se učit nový věci a řešit problémy, ale spíš je obcházet. ;)
Ty kódy ještě zkusím.
ad 1) nenapadá vás řešení?
- Jan Suchánek
- Člen | 404
@had12: No otázka je proč by si takový dotaz chtěl mít přímo v php? Ale budiž.
// count
$this->conn->query("
SELECT
count(forum.*)
FROM forum AS parent
LEFT JOIN forum child ON ON parent.id = child.parent
WHERE parent.type = ?
ORDER BY
parent.date DESC,
parent.id DESC,
child.date,
child.id
", $id);
// limit
$this->conn->query("
SELECT
parent.id parent_id,
parent.authorId parent_authorId,
parent.name parent_name,
parent.date parent_date,
parent.receiver parent_receiver,
parent.text parent_text,
child.id AS chield_id,
child.authorId AS chield_authorId,
child.name AS chield_name,
child.date AS chield_date,
child.text AS chield_text,
child.parent AS chield_parent
FROM forum AS parent
LEFT JOIN forum child ON ON parent.id = child.parent
WHERE parent.type = ?
ORDER BY
parent.date DESC,
parent.id DESC,
child.date,
child.id
LIMIT ? OFFSET ?
", $id, $limit, $offset);
Editoval jenicek (4. 4. 2014 16:09)
- had12
- Člen | 28
no, to ale stejně musím posílat dva dotazy… mě zajímá, jestli je nějaká možnost, jak v prvním kroku vytáhnout všechna data, v druhým je spočítat a ve třetím z těch vytaženejch všech dat vrátit jenom limit()… tohle není v Nette\Database implementováno?
Když jsem vytvořil view, házelo to zase error o chybějícím primary key, kterej ale view mít nemusí. Třeba už jen z tohohle důvodu bych to rád měl v PHP… navíc – tvorbou view budu mít o dotaz navíc.
Do $this->conn->query()
to umím dát taky. Já bych ale
rád využil těch výhod Nette\Database, o kterých se tu pořád všude
básní… a doufal jsem, že třeba právě tohle počítání záznamů a
jejich filtrace už v tom bude vyřešeno… zatím to ale bohužel vypadá,
že tyhle „výhody“ Nette\Database jsou tvrdě vykoupený nepřehledností
syntaxe… (např. jak poznám, že se jedná o SELECT * FROM…, když mi
úplně chybí klauzule select() a select() ani nepodporuje zápis formou
array()?).
Jak tak koukám, tak zlaté dibi, které aspoň tohle umělo: https://dibiphp.com/cs/quick-start#…
Editoval had12 (4. 4. 2014 16:42)
- had12
- Člen | 28
…s tím placeholderem mi někdo, prosím, poradí?
Ještě bych se chtěl optat, zda je někde vytvořená struktura pořadí Nette\Database funkcí (abych věděl, v jakém pořadí je lze používat) – něco, jako existuje třeba zde https://dev.mysql.com/…/select.html pro syntaxi SELECT…?