funkce z modelu v template
- qteck
- Člen | 164
Ahoj,
vybírám články z db, mám tam sloupec autor s id autora. Na stránku chci vypsat jeho jméno a tak se snažím podle id z tebulky article vybrat uživatele podle onoho id z tabulky users.
v modelu jsem si vytvořil funkci getUserById($id)
v presenteru mám inject na třídu ve které tato metoda je a snažím se to v templatu použít tímto způsobem:
{foreach $articles as $row}
<h2 style="margin-bottom: 0;margin-top: 20px; padding-top:20px;border-top: 1px solid #e3e3e3;"><a href="{plink Article: $row->id}-{$row->title|webalize}">{$row->title}</a></h2>
<p style="margin-top: 4px;">
{!$row->perex}
</p>
<span style="font-size: 12px;">{$row->add|date:'j.n.Y'} | <a href="{plink Profil: $row->author}" style="text-transform: capitalize">**{$articles->getNamebyId($row->author)}**</a></span>
{/foreach}
naneštěstí mi to hlasí:
Call to undefined method Nette\Database\Table\Selection::getNamebyId().
Jak tento problém vyřešit?
Říkal jsem si, tak tam nastavím cizí klíče a zkusím to dostat vem pomocí relatived(). Jenže to mi hlasí že tam nejsou žádné reference. Tak nevím. Zkusil jsem to i na opačnou stranu a to nevypíše nic. Navíc potřebuji jenom jeden záznam tak proč nepoužít toto:
function getNamebyId($id)
{
return $this->conn->table("users")->get($id);
}
Díky za helping.
- David Matějka
- Moderator | 6445
Sloupecek by se mel jmenovat author_id a mel by ukazovat na users.id, pak bys jen pouzil
$row->author->name
Pokud se ti sloupecek jmenuje primo author
, muzes pouzit:
$row->ref('author')->name
Jinak by ses mel vyvarovat v template volat fce modelu
Editoval matej21 (23. 5. 2014 17:37)
- David Matějka
- Moderator | 6445
No spis jsem myslel, aby to nebylo jen author
, jak jsem usoudil
z tveho kodu, kde pouzivas prave jen author
pro ziskani ID. Jestli
je to pak id_author
nebo author_id
je jedno. Pokud mas
ale spravne nastavene cizi klice, tak pri $article->author
by ti
to melo vratit radek s tim uzivatelem
- qteck
- Člen | 164
Jko všechno funguje správně, jen debbuger bar mi ukazuje položené dotazy timté způsobem:
Time ms SQL Query Rows
0.174
SET NAMES 'utf8'
...\app\model\Profil.php:16 0
0.297
explain
SELECT `id`, `name`, `photo`
FROM `users`
WHERE (`users`.`id` = '2-petr-stejskal')
...\app\model\Profil.php:16 1
0.402
explain
SELECT `title`, `id`
FROM `books`
WHERE (`id_author` = '2-petr-stejskal')
...\temp\cache\_Nette.FileTemplate\_Profil.default.latte-470f8292f903583d6572def796268987.php:18 2
0.308
explain
SELECT `id`, `id_book`, `title`
FROM `articles`
WHERE (`articles`.`id_book` IN (2, 3)) AND (`id_author` = 2)
DROP TABLE IF EXISTS `articles`;
CREATE TABLE `articles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(60) NOT NULL,
`perex` text NOT NULL,
`text` text NOT NULL,
`id_author` int(11) NOT NULL,
`id_book` int(11) NOT NULL,
`add` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `id_book` (`id_book`),
KEY `id_author` (`id_author`),
CONSTRAINT `articles_ibfk_2` FOREIGN KEY (`id_author`) REFERENCES `users` (`id`),
CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`id_book`) REFERENCES `books` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`photo` varchar(50) NOT NULL,
`caption` text NOT NULL,
`add` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- David Matějka
- Moderator | 6445
to
`id` = '2-petr-stejskal'
vypada, ze tam posilas ty. Neposilas nahodou do modelove tridy „Profil“
cely slug z url? tedy 2-petr-stejskal
?
- qteck
- Člen | 164
no ta url na profily vypadá takto:
<a href=„{plink Profil: $article->ref(‚id_author‘)->id}-{$article->ref(‚id_author‘)->name|webalize}“>{$article->ref(‚id_author‘)->name}</a>
tak teoreticky ano, ale odesílám to stejně aji na články a tam to odchytne jen id.
ty jeména chci mít v url stejně tak jako názvy článků. jakým způsobem se toto tedy řeší? Načtu to tam a pak to teda v modlu jenom vyfiltruju? Existuje na to v nette nějaká vychytávka? Thx
- qteck
- Člen | 164
Další otázkou zda to takto nemůže zůstat. Nakonec stejně jsou to všechno priární klíče nebo cizí klíče typu int
a tak si myslim,, že ta hodnota tam je stejně nakonec (int) „1-Petr-Stejskal“ == 1
??
$nj = (int) "1-Petr-Stejskal";
var_dump($nj); // int(1)
echo $nj; // = 1
Editoval qteck (23. 5. 2014 18:36)
- David Matějka
- Moderator | 6445
V podstate je to jedno. Jak vidis, tak se dotaz sice poklada „osklive“, ale mysql to zpracuje spravne. Ale bylo by lepsi, kdybys z toho udelal int, ja treba radeji pouzivam routy jako:
new Route("/<id \d+>-<slug>");
takze v parametru id mam pouze ono id bez bordelu