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;
    }
}
v presenteru:
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();
    }
}
a v latte šabloně:
<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
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);
Jo a to IDčko na konci ti také nesedí s předchozím řádkem. Podle názvů proměnných předpokládám, že správně je ten první řádek.
Milan1236000
Profil
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}
Ten středníkový separátor tam je jen pro kontrolu, vypadá to, že v poli je to přesně, jak by mělo být, ale u výpisu umělců to ještě není ono. Print_r mi toho taky moc neřekl. Co může být špatně tady?

edit: No jasně, už vím, kde je chyba:
            {foreach $artists[$iterator->counter-1] as $artist}
                {$artist->name}{sep}, {/sep}
            {/foreach} - {$song->title}
tak tedy jen ta otázka, zda by mi, prosím, někdo řekl, kdy je potřeba to fetch psát a kdy ne. Díky.
Kcko
Profil
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
Ok, díky za odpověď.
Keeehi
Profil
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
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
Kcko:
Jo, jo, projdu tu dokumentaci. Taky díky za tip. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0