Čo použiť miesto komponenty?

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

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

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)

Reziw
Člen | 22
+
0
-

Ako naviažem tu relaciu snažím sa nájsť o tom článok a nejaky návod a však neuspešne mohol by si mi poslať nejaky odkaz prípade mi ukázať na screenoch ako to robíš ? Ďakujem

Mysteria
Člen | 797
+
0
-

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

Reziw
Člen | 22
+
0
-

@GEpic spôsob Gepica sa mi zapáčil viac mohol by si ma prosím ťa odkázať na nejaky tutorial prípadne ukázať mi na jednoduchom príklade ako na to ?

Mysteria
Člen | 797
+
0
-

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

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

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

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

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

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

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

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

https://ctrlv.cz/LTv4

Editoval Reziw (26. 5. 2016 22:32)

Reziw
Člen | 22
+
0
-

Niekto nejaky nápad ?

David Matějka
Moderator | 6445
+
0
-

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

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

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

@Mysteria neni potreba to mit pojmenovane news_category_id… v pripade discovery reflection je to jedno..

Mysteria
Člen | 797
+
+1
-

Já vím, ale nějak jsem si zvykl to takhle pojmenovávat. Připadá mi to přehledný, kouknu na tabulku, vidím sloupec news_category_id a hned z toho vidím, že to je cizí klíč na sloupec id v tabulce news_category bez toho, abych to musel nějak blíže zkoumat.

Reziw
Člen | 22
+
0
-

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 ?