| 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: 7 let
|
|||
0