Geek tričko zdarma Python týden
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: Joiny v Nette

Aktivity (2)
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  +1 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. ledna 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. ledna 12:15
Avatar
Mirek Slouka
Člen
Avatar
Odpovídá na Lukáš Spurný
Mirek Slouka:17. ledna 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. ledna 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. ledna 12:51

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

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

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

 
Nahoru Odpovědět 18. ledna 13:41
Avatar
Lukáš Spurný:28. ledna 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. ledna 11:25
Avatar
dez1nd
Člen
Avatar
Odpovídá na Lukáš Spurný
dez1nd:28. ledna 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. ledna 13:57
 
Nahoru Odpovědět 28. ledna 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.