JSON response z activerow

jirisolc
Člen | 17
+
0
-

Zdravím,
nedaří se mi odeslat ActiveRow jako JSON response z presenteru.

Kód v repository: (findAll metoda)

$this->database
            ->table($this->tableName)
            ->select(implode(',', $this->columns))->fetchAll();

find($id) metoda:

$this->database
	->table($this->tableName)
    >select(implode(',', $this->columns))
 	->get($id);;

Kód v presenteru:

public function actionRead(?int $id = null): ?mixed
    {
        $response = null;
        if ($id !== null) {
            $response = $this->serviceCategoriesManager->find($id);
            if($response === null){
                $this->error('Kategorie nenalezena', HttpCodesEnum::NOT_FOUND);
            }
        } else {
            $response = $this->serviceCategoriesManager->findAll();
        }
        $this->sendJson($response);
    }

Pokud do metody pošlu ID a převedu response toArray, vrátí JSON objekt, jaký si představuji. Pokud ale provedu pouze kód výše zmíněný, v případě s ID i bez ID vrátí pouze prázdný objekt (bez ID více prázdných objektů dle počtu řádků v DB).

Příklad vráceného JSON:
{
„1“: {},
„2“: {},
„3“: {},
„4“: {},
„5“: {},
„6“: {},
„7“: {},
„8“: {},
„9“: {}
}

Když $response dumpnu v Tracy, vrací normálně instance ActiveRow i s daty, ale do JSONu se nepřevedou. Viz Screenshot

Kde dělám chybu?

Editoval jirisolc (10. 11. 2021 20:32)

jirisolc
Člen | 17
+
0
-

neznamy_uzivatel napsal(a):

Tady: https://forum.nette.org/…-vypisu-z-db#…

Chápu tedy správně, že musím použít

$this->db->query(...)->fetch()

??

Polki
Člen | 553
+
+1
-

ActiveRow má jen ArrayAccess ale aby jsi z něj udělal pole, které jde konvertovat na JSON, tak musíš nad tím ActiveRow nejdřív zavolat metodu ->toArray.

To znamená, že když dáš fetchAll, tak musíš pak ještě projít výsledné pole foreachem a všechny prvky změnit na pole.

Pavel Kravčík
Člen | 1196
+
-1
-

Další možností je třeba si upravit \Nette\Database\Drivers\MySqlDriver a následně pak options > driverClass. Můžeš si případně změnit, co Ti Nette bude vracet z DB. My to používáme na podobnou věc a to, že máme v entitě array a do DB se uloží jako json a pak při výpisu obráceně.