Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Joiny v Nette

Aktivity
Avatar
Ondřej Langr (andysekcze):10.3.2018 15:06

Ahoj, dal jsem Nette další šanci (dokopal jsem se k tomu se to naučit asi po třetí) a dělám si vlastní CMS(jak překvapivé), na kterém se učím. Mám tabulky: comments, user, article. Mám jen jeden cizí klíč, a je nastavený v tabulce comment na sloupci article_id a ukazuje na to samé v tabulce article. Mým cílem je získat pomocí user_id z tabulky comments(a article, ale to je vedlejší) uživatelovo nickname pomocí právě toho ID, které je samozřejmě shodné z tabulky user. Vyzkoumal jsem(Díky Pavole), že tam bude JOIN zleva a SQL jako takové funguje. Otázkou je, jak to přepsat do Nette?
SQL:

SELECT `comment_id`, `article_id`, `comments`.`user_id`, `content`, `timestamp`, `rating`, `username` FROM `comments` LEFT JOIN `user` ON `comments`.`user_id` = `user`.`user_id`

Pokus v Nette:

$comments = $article->related('comment')->select('comment.*, user.username')
            ->joinWhere('user', 'user.user_id = comment.user_id')
            ->order('timestamp');

a samozřejmě to háže inreferenci. Zde: Nette\InvalidAr­gumentExcepti­on - No reference found for $comments->comment.
Dokumentaci jsem četl a moc chytrý z ní nejsem. Za každou radu budu rád. Díky :)

Odpovědět
10.3.2018 15:06
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
CZkiniCZ
Člen
Avatar
CZkiniCZ:10.3.2018 18:35

Zkus to se dvěma cizíma klíčema takto:

public function getPage($url)
        {
                $page = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_URL, $url)->fetch();
                return $page->related('comment');

        }

{foreach $pages as $page}
{$page->article->content|noescape}
{$page->content}
{$page->user->username}
{/foreach}
Editováno 10.3.2018 18:36
Nahoru Odpovědět
10.3.2018 18:35
Age of the geek.
Avatar
Odpovídá na CZkiniCZ
Ondřej Langr (andysekcze):10.3.2018 19:19

github.com/lan­griklol/cms - ArticleManager nebo Presenter. Tak to tam zhruba je :) ten cizí klíč jsem zkoušel dát další jako user_id na tabulku user na user_id a stejně to házelo inreferenci. Zkusím zítra a dám vědět. :)

Nahoru Odpovědět
10.3.2018 19:19
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Dominik Gavrecký:10.3.2018 19:32

Prečo to riešiť cez Join ? Nie som si istý či ti rozumiem ale v tabuľke comments máš user_id na ktorom máš cudzí kľúč a potrebuješ meno toho usera ? Ak áno v tom prípade
https://doc.nette.org/…ase-explorer#…

Nahoru Odpovědět
10.3.2018 19:32
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Dominik Gavrecký
Ondřej Langr (andysekcze):10.3.2018 19:46

Jasně, takže tohle si potom hodím na $comments ?

Nahoru Odpovědět
10.3.2018 19:46
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Dominik Gavrecký:10.3.2018 19:49

Vytiahni si cez select všetky comments ktoré potrebuješ. A potom v latte použiješ $comments->ref(,)->username

Editováno 10.3.2018 19:50
Nahoru Odpovědět
10.3.2018 19:49
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Dominik Gavrecký:10.3.2018 19:56

Zo staršieho projektu:

{if $data->sender_id == NULL}
                                    <a href="">Systém</a>
                                {else}
                                    <a n:href="User:profile, $data->ref('users', 'sender_id')->id">{$data->ref('users', 'sender_id')->username}</a>
{/if}
Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět
10.3.2018 19:56
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Dominik Gavrecký
Ondřej Langr (andysekcze):11.3.2018 15:58

Díky, pomohlo :) Holt to s tím Nette bude asi na dýl, než jsem čekal no :D

Nahoru Odpovědět
11.3.2018 15:58
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Lukáš Spurný:17.1.2019 12:15

Ahoj, také začínám a mám stejný problém, už si s tím lámu hlavu několik hodin a netuším co dělám špatně.

mysql funguje:

SELECT news.*, SUM(evaluation.inch_up) AS inch_up , SUM(evaluation.inch_down) AS inch_down FROM news LEFT JOIN evaluation ON news.id = evaluation.news_id GROUP BY news.id

v nette nejde:

$back = $this->database->table('news')
            ->select('news.*, SUM(evaluation.inch_up) AS inch_up , SUM(evaluation.inch_down) AS inch_down')
            ->joinWhere('evaluation','evaluation.news_id = news.id')
            ->group('news.id');

Column not found: 1054 Unknown column 'evaluation.in­ch_up' in 'field list'

co dělám za blbost ?
Dík

 
Nahoru Odpovědět
17.1.2019 12:15
Avatar
Mirek Slouka
Člen
Avatar
Odpovídá na Lukáš Spurný
Mirek Slouka:17.1.2019 13:15

Težko říct, nech si to vypsat jako SQL do Tracy, tam nejspíš půjde vidět kde je chyba.

Nahoru Odpovědět
17.1.2019 13:15
I can explain it to you, but I can't understand it for you.
Avatar
dez1nd
Člen
Avatar
Odpovídá na Lukáš Spurný
dez1nd:18.1.2019 12:51

Zkus dát před každé SUM dvojtečku.

 
Nahoru Odpovědět
18.1.2019 12:51
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:18.1.2019 13:41

Teda houby před SUM ale před název tabulky evaluation

 
Nahoru Odpovědět
18.1.2019 13:41
Avatar
Lukáš Spurný:28.1.2019 11:25

dvojtečky také nepomohly. v tracy mi ukazuje příkaz

SELECT `news`.*, SUM(:`evaluation`.`inch_up`) AS `inch_up` , SUM(:`evaluation`.`inch_down`) AS
`inch_down`
FROM `news`
GROUP BY `news`.`id`

chybí JOIN, vůbec nevím proč

 
Nahoru Odpovědět
28.1.2019 11:25
Avatar
dez1nd
Člen
Avatar
Odpovídá na Lukáš Spurný
dez1nd:28.1.2019 13:56

máš v tabulce evaluation klíč na tabulku news ? pokud ne dvojtečky nepomůžou. V nette jsem několikrát tyhle věci taky řešil, nakonec jsem se na to vykašlal a napsal SQL dotaz.

Editováno 28.1.2019 13:57
 
Nahoru Odpovědět
28.1.2019 13:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.