funkce z modelu v template

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

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

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)

qteck
Člen | 164
+
0
-

Proč by se měl jmenovat author id? Můj se jmenuje id_author.

Je v tom nějaká vychytávka?

David Matějka
Moderator | 6445
+
0
-

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

je v pořádku, když mi to pokládá takovéhle dotazy?

SELECT id, name, photo
FROM users
WHERE (users.id = ‚1-patrik-stejskal‘)

konrétně toto „1-patrik-stejskal“

href=„{plink Profil: $row->id_author}-{$row->ref(‚id_author‘)->name|webalize}“

odkaz vytvářím takto:

David Matějka
Moderator | 6445
+
0
-

ukaz strukturu db (tech dvou tabulek) vcetne FK

qteck
Člen | 164
+
0
-

Co je FK?

David Matějka
Moderator | 6445
+
0
-

foreign key

qteck
Člen | 164
+
0
-

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

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

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

ou, tak v article presenteru jsem měl chybu, tak to funguje všude stejně v tom formatu int-string.

takže jedině filtrovat v modelu?

qteck
Člen | 164
+
0
-

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

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