Čo použiť miesto komponenty?
- Reziw
- Člen | 22
Ahojte chcem sa opýtať ako sa v nette rieši (uvediem príklad)
Mám tabuľku News ktorá obsahuje id category category odkazuje int na id tabuľky News_category ktorá dalej obsahuje stlpec so stringom teda názvom kategorie. Teda vyzerá to nejako takto:
Tabuľka News
`id name category_id
1 prvá_novinka 12
`
Tabuľka News_category
`id name
12 kategoria_ktorupotrebujem`
Ked chcem vypísať všetky novinky normálne si to selectnem a vytiahnem ale namiesto id tej kategorie potrebujem práve jej názov. Mám niekoľko nápadov ako to riešiť ale všetko z toho mi príde ako prasárna.
Aké je to správne KnowHow ?
Ďakujem
- GEpic
- Člen | 566
To se řeší pomocí relací v databázi. Pokud využíváš Nette Database a máš tabulky s použitím enginu / uložiště InnoDB (Namísto MyISAM) můžeš si na sloupec category_id nastavit INDEX a poté navázat relaci kde category_id je klíčem v tabulce category na sloupci id.
Poté se to využívá takto:
public function renderNew($id)
{
$novinka = $this->database->getTable('news')->where('id', $id)->fetch();
$this->template->novinka = $novinka;
}
A pak např v šabloně přístup takto:
Název kategorie:
{$novinka->category->name}
Obsah novinky:
{$novinka->content}
Dále můžeš k novinkám přiřazovat například uživatele, a funguje to
opět stejně.
Vytvoříš si sloupec user_id, nastavíš klíč na INDEX, poté, pokud
používáš phpMyAdmin, tak záložku Zobrazení relací, a
tam nastavit opět sloupec user_id na tabulku users a sloupec ID.
A opět ti pak bude fungovat např:
Autor novinky:
<a href="mailto:{$new->user->email}">{$new->user->nick}</a>
Editoval GEpic (25. 5. 2016 1:00)
- Mysteria
- Člen | 797
Buď dodržováním konvencí (názvů sloupců a tabulek) nebo používáním cizích klíčů. https://doc.nette.org/…ase/explorer
- Mysteria
- Člen | 797
To na co jsem tě odkázal já a to co ti vysvětloval @GEpic je úplně to samé. Co konkrétně ti nefunguje nebo nechápeš na tom příkladu, co ti tam vypsal? Za předpokladu, že máš v těch tabulkách, které jsi uvedl v prvním příspěvku nadefinován cizí klíč mezi News.category_id a News_category.id by ti to vypisování názvu kategorií k novinkám mělo fungovat.
Případně ještě se můžeš podívat sem, tam je taky i na příkladech vysvětleno jak funguje tohle přepínání kontextu mezi provázanými tabulkami ať už v jednom nebo druhém směru.
Editoval Mysteria (26. 5. 2016 0:46)
- Reziw
- Člen | 22
Vypíše mi ID kategorie a nie názov tej kategorie a keď použijem ->fetch() nemôžem použiť $data->sss ale $data[‚sss‘] dá sa aj toto nejako vyriešiť ?
Mysteria napsal(a):
To na co jsem tě odkázal já a to co ti vysvětloval @GEpic je úplně to samé. Co konkrétně ti nefunguje nebo nechápeš na tom příkladu, co ti tam vypsal? Za předpokladu, že máš v těch tabulkách, které jsi uvedl v prvním příspěvku nadefinován cizí klíč mezi News.category_id a News_category.id by ti to vypisování názvu kategorií k novinkám mělo fungovat.
Případně ještě se můžeš podívat sem, tam je taky i na příkladech vysvětleno jak funguje tohle přepínání kontextu mezi provázanými tabulkami ať už v jednom nebo druhém směru.
- Reziw
- Člen | 22
Tu je screen relacie https://ctrlv.cz/AHaI
Tu tabuľky news https://ctrlv.cz/MB4s a news_category https://ctrlv.cz/Pj8s už si neviem dať radyň
postupoval som podľa http://www.dubak.sk/…tabaze-mysql
Editoval Reziw (26. 5. 2016 1:13)
- GEpic
- Člen | 566
Já měl velký problém v případě, že jsem použil vícekrát
_
v názvu sloupce s relací. Proto používám vždy jednoduché
názvy
+ _id
… např „new_id
“,
„category_id
“
EDIT:
Navíc pokud použiješ fetch()
, tak by měli nadále fungovat
„šipky“, přistupování ke sloupcům přes pole by mělo jít
v případě, že použiješ $row->toArray()
Editoval GEpic (26. 5. 2016 1:40)
- Reziw
- Člen | 22
Inač je v tej relaci všetko dobre ?
GEpic napsal(a):
Já měl velký problém v případě, že jsem použil vícekrát
_
v názvu sloupce s relací. Proto používám vždy jednoduchénázvy
+_id
… např „new_id
“, „category_id
“EDIT:
Navíc pokud použiješfetch()
, tak by měli nadále fungovat „šipky“, přistupování ke sloupcům přes pole by mělo jít v případě, že použiješ$row->toArray()
- Reziw
- Člen | 22
GEpic napsal(a):
Já měl velký problém v případě, že jsem použil vícekrát
_
v názvu sloupce s relací. Proto používám vždy jednoduchénázvy
+_id
… např „new_id
“, „category_id
“EDIT:
Navíc pokud použiješfetch()
, tak by měli nadále fungovat „šipky“, přistupování ke sloupcům přes pole by mělo jít v případě, že použiješ$row->toArray()
Pri použití tohto dotazu mi vyhodí error PHP Notice: Trying to get property of non-object in ked použijem „šipky“
public function getNews()
{
return $this->database->table(self::NEWS_TABLE)->fetch();
}
celý deň sa s tým hrajem a stále mi vrati ID kategorie namiesto jej názvu
- Mysteria
- Člen | 797
Když chceš vybrat všechny novinky, tak musíš použít fetchAll, což ti vrátí celou tabulku (fetch vrátí jeden konkrétní záznam).
public function getNews() {
return $this->database->table(self::NEWS_TABLE)->fetchAll();
}
V šabloně pak {foreach $news as $new} {$new->category->name} {/foreach}
Každopádně nejlepší by asi bylo, kdybys se hodil celej kód (tzn. celej obsah presenteru, modelu a šablony), protože bez toho těžko říct co kde máš špatně.
- Reziw
- Člen | 22
Mysteria napsal(a):
Když chceš vybrat všechny novinky, tak musíš použít fetchAll, což ti vrátí celou tabulku (fetch vrátí jeden konkrétní záznam).
public function getNews() { return $this->database->table(self::NEWS_TABLE)->fetchAll(); }
V šabloně pak {foreach $news as $new} {$new->category->name} {/foreach}
Každopádně nejlepší by asi bylo, kdybys se hodil celej kód (tzn. celej obsah presenteru, modelu a šablony), protože bez toho těžko říct co kde máš špatně.
<tr n:foreach="$news as $data">
<td>{$data->title}</td>
<td><a href="#">Admin</a></td>
<td></td>
<td>{$data->category}</td>
</tr>
/**
* Render Default
*/
public function renderDefault()
{
$this->template->news = $this->newsManager->getNews();
}
/**
* @return \Nette\Database\Table\Selection
* Vráti výpis všetkých noviniek
*/
public function getNews()
{
return $this->database->table(self::NEWS_TABLE)->fetchAll();
}
šipky funguju a však neviem sa dostať ku tej kategorie stále mi vráti len ID namiesto názvu tej kategorie
Editoval Reziw (26. 5. 2016 22:32)
- David Matějka
- Moderator | 6445
Mas sloupecek pojmenovany „category“, takze to vrati ID. Logika „spojovacich klicu“ je vysvetlena tady..
Muzes tedy bud explicitne rict, ze chces asociaci (myslim, ze
$data->ref('category')
), nebo sloupecek prejmenuj na
category_id. Pak, kdyz se dotazes pres $data->category
, tak
nette dohleda asociaci.
- Reziw
- Člen | 22
David Matějka napsal(a):
Mas sloupecek pojmenovany „category“, takze to vrati ID. Logika „spojovacich klicu“ je vysvetlena tady..
Muzes tedy bud explicitne rict, ze chces asociaci (myslim, ze
$data->ref('category')
), nebo sloupecek prejmenuj na category_id. Pak, kdyz se dotazes pres$data->category
, tak nette dohleda asociaci.
Nefunguje stále to vráti len ID
- Mysteria
- Člen | 797
Nejjednodušší varianta jak tohle rozchodit bude ta, že předěláš ty tabulky tak, aby dodržovali pokud možno nějaké standardní pojmenování. Pojmenovat si tabulku news_category a jako primární klíč dát sloupec category_id není ideální.
Takže například struktura databáze:
CREATE TABLE `news_category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `news` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`content` varchar(10000) COLLATE utf8_unicode_ci NOT NULL,
`news_category_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `news_category_id` (`news_category_id`),
CONSTRAINT `news_category_id` FOREIGN KEY (`news_category_id`) REFERENCES `news_category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
A pak ti to bude fungovat takhle:
foreach ($this->database->table('news') as $new) {
// Vypíše třeba: News 1 in category Category 1
dump($new->title . ' in category ' . $new->news_category->name);
}
- David Matějka
- Moderator | 6445
@Mysteria neni potreba to mit pojmenovane
news_category_id
… v pripade discovery reflection je to
jedno..
- Reziw
- Člen | 22
Mysteria napsal(a):
Nejjednodušší varianta jak tohle rozchodit bude ta, že předěláš ty tabulky tak, aby dodržovali pokud možno nějaké standardní pojmenování. Pojmenovat si tabulku news_category a jako primární klíč dát sloupec category_id není ideální.
Takže například struktura databáze:
CREATE TABLE `news_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE `news` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `content` varchar(10000) COLLATE utf8_unicode_ci NOT NULL, `news_category_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `news_category_id` (`news_category_id`), CONSTRAINT `news_category_id` FOREIGN KEY (`news_category_id`) REFERENCES `news_category` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
A pak ti to bude fungovat takhle:
foreach ($this->database->table('news') as $new) { // Vypíše třeba: News 1 in category Category 1 dump($new->title . ' in category ' . $new->news_category->name); }
Ďakujem ti toto mi funguje kde bol problém ?