Získání jména redaktora dle ID z jiné tabulky (Context error)

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

Ahoj,

začínám s nette a mám problém s databázemi.

Připojení do databáze mám přes config.neon a to funguje, pak mám načítání příspěvku z jedné tabulky, kde vlastně načtu nadpis datum a id autora.

Tady nastává problém, vše bez problému vypíši, ale co pochopitelně nechci je ID autora, ale jeho jméno. To ej ale v jiné tabulce, takže potřebuji nějak pracovat i s tou druhou tabulkou (admins).

Podle toho, co jsem se dočetl je na to ideální Nette Database Explorer. Prošel jsem si tedy návod
zde https://doc.nette.org/…ase/explorer#…

Bohužel mi traci vypisuje, že nezná context. Tak hledám dál a najdu toto.

https://api.nette.org/…Context.html (jako začátečník jsem to toho vlastně nic moc nevyčetl)

a pak

https://doc.nette.org/…atabase/core#…

ale nikde se tu nezmiňují o tom context. Co jsme pochopil, vše potřebné by si to mělo vytvořit samo, protože jsme použil připojení přes config.neon a vážně netuším, kde tedy může být chyba.

<?php

namespace App\Presenters;

use Nette;

class HomepagePresenter extends BasePresenter {

    private $database;

    // pro práci s vrstvou Database Explorer si předáme Nette\Database\Context
    public function __construct(Nette\Database\Connection $database) {
        $this->database = $database;
    }

    public function renderDefault() {
        $articles = $context->table('articles');

        foreach ($articles as $article) {
            echo 'title:      ' . $article->title;
            echo 'describe:      ' . $article->describe;

            echo 'creators: ';
            foreach ($article->related('admins') as $creator) {
                echo $creator->jmeno . ', ';
            }
        }
    }
}

?>

popravdě ani pořádně nevím, jak zde myslí předat, já myslel, že to už si zařizuje samo..

„pro práci s vrstvou Database Explorer si předáme Nette\Database\Context“

Kdyby se tu našel někdo tak hodný a vysvětlil by mi, jak na to, nebo co vlastně hledám.. Už jsem z toho docela zmatenej, kolik jsme toho přečetl a nikde ani zmínka o „Undefined variable: context“.

Děkuju :)

David Matějka
Moderator | 6445
+
0
-

ten context si predej pres konstruktor jako to nyni delas s database connection – a tu connection muzes pote smazat.

k4znIm
Člen | 3
+
0
-

David Matějka napsal(a):

ten context si predej pres konstruktor jako to nyni delas s database connection – a tu connection muzes pote smazat.

To mi pak ale bude vypisovat, že nezná $database ne? Jsem z toho fakt už dneska úplně zmatenej..

duke
Člen | 650
+
0
-

David Matějka napsal(a):

ten context si predej pres konstruktor jako to nyni delas s database connection – a tu connection muzes pote smazat.

To mi pak ale bude vypisovat, že nezná $database ne? Jsem z toho fakt už dneska úplně zmatenej..

Nebude (když tu proměnnou $connection všude nahradíš tím $context). Nette\Database\Context je služba, která v sobě udržuje odkaz na službu Nette\Database\Connection, neboť ji vnitřně využívá. Je to vlastně taková obálka nad ní, poskytující funkcionalitu navíc. Pokud bys tu Connection potřeboval přímo, můžeš přes $context->getConnection(), nebo i zkráceně přes $context->connection.

Editoval duke (11. 12. 2017 19:09)

k4znIm
Člen | 3
+
0
-

duke napsal(a):

David Matějka napsal(a):

ten context si predej pres konstruktor jako to nyni delas s database connection – a tu connection muzes pote smazat.

To mi pak ale bude vypisovat, že nezná $database ne? Jsem z toho fakt už dneska úplně zmatenej..

Nebude (když tu proměnnou $connection všude nahradíš tím $context). Nette\Database\Context je služba, která v sobě udržuje odkaz na službu Nette\Database\Connection, neboť ji vnitřně využívá. Je to vlastně taková obálka nad ní, poskytující funkcionalitu navíc. Pokud bys tu Connection potřeboval přímo, můžeš přes $context->getConnection(), nebo i zkráceně přes $context->connection.

Jasný, takže pak to nepotřebuji, jak psal už David..

<?php

namespace App\Presenters;

use Nette;

class HomepagePresenter extends BasePresenter {

    private $database;

    // pro práci s vrstvou Database Explorer si předáme Nette\Database\Context
    public function __construct(Nette\Database\Context $context) {
        $this->context = $context;
    }

    public function renderDefault() {
        $articles = $context->table('articles');

        foreach ($articles as $article) {
            echo 'title:      ' . $article->title;
            echo 'describe:      ' . $article->describe;

            echo 'creators: ';
            foreach ($article->related('admins') as $creator) {
                echo $creator->jmeno . ', ';
            }
        }
    }
}

?>

Takže vlastně takto, pokud rozumím? Ale je to read-only, takže se tomu zase něco nelíbí.. (omlouvám se, ale fakt tomu ještě moc nerozumím :D ) Kdyby jsi mi to mohl ukázat na tom kódu mém, byl bych moc rád, potřeboval bych to vidět.. Potřebuji jen ze 2 tabulek získávat data (articles-title,posted,creator(id) — admins-name(podle toho id))

GEpic
Člen | 566
+
+1
-

Ahoj, pokud máš správně nastavené relace v databázi tak by to mělo jít přes $article->creator->name, sloupeček s creatorem se musí jmenovat creator_id – jestli jsem pochopil dobře, že každý article má jednoho creatora

Editoval GEpic (12. 12. 2017 8:16)

David Matějka
Moderator | 6445
+
0
-

v konstruktoru zapisujes do context

$this->context = $context;

ale clenska promenna se ti jmenuje database

private $database;

a pak k tomu pristupujes jako k lokalni promenne a ne jako k clenske promenne

$context->table(...