Autor | Zpráva | ||
---|---|---|---|
Milan1236000 Profil |
Ahoj, mám následující situaci:
v databázi mám tabulky song a artist. V modelu následující kód: namespace App\Model; use App\Model\DatabaseManager; class SongManager extends DatabaseManager { public function getSongs() { return $this->database->table('song')->order('song_id DESC'); } public function getArtists() { $artists = []; $songy = $this->getSongs(); foreach ($songy as $song) { array_push($artists, $this->database->table('artist')->where('artist_id', $song->art_id)); //$artists = $this->database->table('artist')->where('artist_id', $song->song_id); } return $artists; } } namespace App\Presenters; use App\Model\SongManager; class SongPresenter extends BasePresenter { private $songManager; public function __construct(SongManager $songManager) { parent::__construct(); $this->songManager = $songManager; } public function renderSongs() { $this->template->songs = $this->songManager->getSongs(); $this->template->artists = $this->songManager->getArtists(); } } <li n:foreach="$songs as $song"> <a href="song/{$song->song_id}">{$artists[$iterator->counter]->name} - {$song->title}</a> </li> Pokud v modelu ve foreach zakomentuju array_push a odkomentuju řádek pod tím, v šabloně se u první položky vypíše umělec z poslední iterace foreach v modelu a zbytek položek se vypíše bez umělce. Nevím, kde může být chyba. Jestli někdo něco špatně vidí, budu rád za radu. :) |
||
Keeehi Profil |
#2 · Zasláno: 6. 11. 2018, 05:54:52
Tak předně to je tím, že to pole nahradíš obyčejnou hodnotou. Vypadli ti tam závorky aby jsi přidal prvek do pole.
$artists[] = $this->database->table('artist')->where('artist_id', $song->song_id); |
||
Milan1236000 Profil |
#3 · Zasláno: 6. 11. 2018, 20:14:12
Keeehi:
A jo, závorky. ID jsem taky správně přepsal, ale zobrazovalo se úplně to samé co u toho array_push(). Po delší chvíli zkoumání jsem přišel na to, že mi tam u čtení umělců chybělo ...->fetch() . Není mi jasné, kdy je to nutné psát a kdy ne, protože u čtení songů to není potřeba (aspoň to funguje bez toho).
Díky za radu. :) |
||
Milan1236000 Profil |
Trochu mě zaráží, že mi tam NetBeans ty závorky u přiřazování do pole neoznačil žárovkou...
Trochu jsem to rozšířil, takže mám nyní kromě tabulek song a artist ještě artist_song , kde je spojuju a vzniká vazba M:N. Opět jsem ve slepé uličce, kdy nevím kudy dál.
Normálně jsem z Javy zvyklý chyby hledat debuggerem, ale v php mi to nějak nejde. Označím si na nějakém řádku breakpoint, spustím debugování, ale v prohlížeči se všechno načte bez toho, abych v NetBeansu mohl krokovat. Nyní mám následující: namespace App\Model; use App\Model\DatabaseManager; class SongManager extends DatabaseManager { public function getSongs() { return $this->database->table('song')->order('song_id DESC'); } public function getSong($id) { return $this->database->table('song')->where('song_id', $id)->fetch(); } public function getArtists() { $artists = []; $songs = $this->getSongs(); foreach ($songs as $song) { $art = []; foreach ($song->related('artist_song', 'song_id') as $artist_song) { $art[] = $artist_song->artist; } $artists[] = $art; unset($art); } return $artists; } } {block content} <h1>Songy</h1> <hr> <ol> <li n:foreach="$songs as $song"> <a href="song/{$song->song_id}"> {foreach $artists as $artist} {foreach $artist as $a} {$a->name}{sep}, {/sep} {/foreach}{sep}; {/sep} {/foreach} - {$song->title} </a> </li> </ol> {php print_r($artists); } {/block} edit: No jasně, už vím, kde je chyba: {foreach $artists[$iterator->counter-1] as $artist} {$artist->name}{sep}, {/sep} {/foreach} - {$song->title} fetch psát a kdy ne. Díky.
|
||
Kcko Profil |
#5 · Zasláno: 8. 11. 2018, 15:26:56
Milan1236000:
Pokud uděláš SQL dotaz přes NDB tak máš "selection", což je nějaký objekt, který můžeš ještě dál upravovat (např. nastavit limit, přidat další podmínku atd). Pokud ale potřebuješ pracovat s daty, tak na tom musíš zavolat nějaký fetch fetchAll fetch fetchField fetchPairs() díky tomu poté ze selection dostaneš activeRow, což je objekt, který mj. prezentuje řádek v tabulce = data. Pokud použiješ na selection foreach, tak díky interní implementaci se z toho v tu chvíli taky stane activeRow. Přečti si pořádně dokumentaci k Nette. |
||
Milan1236000 Profil |
#6 · Zasláno: 8. 11. 2018, 17:43:53
Ok, díky za odpověď.
|
||
Keeehi Profil |
#7 · Zasláno: 8. 11. 2018, 23:14:26
Milan1236000:
Pokud chceš debugovat, tak to není tak přímočaré jako u Javy. První podmínka je mít nainstalovaný a povolený xdebug. Dále je potřeba říct xdebugu, že se má zapnout a poslouchat. Což se dá udělat nekolika způsoby, já mám rád ten kde se nastavuje speciální cookie. Nastavovat ručně by byl opruz, takže na to používám rozšíření do prohlížeče. No a nakonec je potřeba nakonfigurovat IDE aby se na xdebug připojilo a poslouchalo. Na všechno ale existují návody, takže s trochou googlení bys neměl mít problém to zprovoznit. |
||
Milan1236000 Profil |
#8 · Zasláno: 9. 11. 2018, 06:41:33
Keeehi:
Díky za tip, mrknu na nějaký návod. :) |
||
Kcko Profil |
Milan1236000:
Keehi Ti trošku zamotal hlavu, ano na debugování Xdebug. Ale ty jsi se primárně ptal na print_r a proč Ti to nezobrazuje to co si myslíš, že by mělo. Jelikož používáš framework Nette, tak se nauč "printovat" proměnné pomocí interního debuggeru. Tj. \Tracy\Debugger::barDump();
Nette je plné objektů různé poskládaných do sebe a print_r() Ti s tím nepomůže, vykreslit to nějak lidsky, aby to bylo čitelné. PS. Ptej se na Nette fóru a případně hledej i tam, to co řešíš tam před tebou na 90% řešili i jiní. |
||
Milan1236000 Profil |
#10 · Zasláno: 9. 11. 2018, 14:44:47
Kcko:
Jo, jo, projdu tu dokumentaci. Taky díky za tip. :) |
||
Časová prodleva: 5 let
|
0