addSelect obsah db zobrazuje chybu

mimacala
Člen | 113
+
0
-

Zobrazí se mi chybová hláška

Attempt to read property "safeName" on array
   $form = new Form;
132:            $form->addSelect('safe', 'Safe:', $arrsafe->safeName); // tady to svítí červeně
133:            $form->addSubmit('send', 'Delete');
134:            $form->onSuccess[] = [$this, 'Deletesuccess'];
135:            return $form;

Takto vypadá kód

    function createComponentDelete(): Form
        {

        $arrsafe = $this->db->table("safe")
                        ->where("idUser", $this->user->getId())
                        ->fetchAll();


        $form = new Form;
        $form->addSelect('safe', 'Safe:', $arrsafe->safeName);
        $form->addSubmit('send', 'Delete');
        $form->onSuccess[] = [$this, 'Deletesuccess'];
        return $form;
        }

Zkoušel jsem bez použití fetchall(), zkusil jsem i použít select na safeName a zároven jen fetch(), ale stále mi to vyhazuje chybu :/
Nevšiml si někdo co přehlížím za problém ?
Moc Děkuji za odpověď

Editoval mimacala (13. 1. 2022 20:58)

Kamil Valenta
Člen | 758
+
0
-
    function createComponentDelete(): Form
        {

        $arrsafe = $this->db->table("safe")
                        ->where("idUser", $this->user->getId())
                        ->fetchPairs('safeName', 'safeName');


        $form = new Form;
        $form->addSelect('safe', 'Safe:', $arrsafe);
        $form->addSubmit('send', 'Delete');
        $form->onSuccess[] = [$this, 'Deletesuccess'];
        return $form;
        }

Není zřejmé co má být obsahem selectu, možná pairs id+name…

mimacala
Člen | 113
+
0
-

Aha funguje, ale pořád moc nechápu co to vlastně udělá, pokud bych nyní chtěl použít $arrsafe->money, tak by to nešlo.
je nějaká možnost jak to udělat, abych mohl používat $arrsafe->money, $arrsafe->id, $arrsafe->safeName ?
Ještě jednou děkuji

JakubH
Člen | 13
+
-2
-

Ahoj

je nějaká možnost jak to udělat, abych mohl používat $arrsafe->money, $arrsafe->id, $arrsafe->safeName ?

áno je to možné.
Urob si keď tak ďalšiu premennú a pred názov starej premennej si daj (object)

$arrsafe2 = (object) $arrsafe;

Toto riešenie ti dá obsah poľa do objektu.
Už bude fungovať $arrsafe2->money

Aha funguje, ale pořád moc nechápu co to vlastně udělá, pokud bych nyní chtěl použít $arrsafe->money, tak by to nešlo.

Prikladám linky, kde je ukázané čo fetchAll a fetchPairs vrátia

https://doc.nette.org/…atabase/core#…
https://doc.nette.org/…ase/explorer#…

mimacala
Člen | 113
+
0
-

Jo tak,
no hodilo to chybu ⇒ zkoušel jsem i oddělat fetchpairs ale stejně to hodilo chybu.

Undefined property: stdClass::$safeName
  function createComponentDelete(): Form
        {

        $arrsafe = $this->db->table("safe")
                        ->where("idUser", $this->user->getId())
                        ->fetchPairs('safeName', 'safeName');
        $arrsafe2 = (object)$arrsafe;


        $form = new Form;
        $form->addSelect('safenm', 'Safe:', $arrsafe2->safeName);
        $form->addSubmit('send', 'Delete');
        $form->onSuccess[] = [$this, 'Deletesuccess'];
        return $form;
        }

a proč je potřeba dělat object, pokud to chápu správně v proměnné $arrsafe je nyní pole, které vypadá nějak takto ?
safeName[0] = safe1
safeName[1] = safe2
money[3] = 1000
money[4] = 2000
Děkuji

Editoval mimacala (13. 1. 2022 21:53)

JakubH
Člen | 13
+
0
-

Ak chceš používať tento zápis $variable->? tak vtedy musí ísť pole do objektu.
Nevidím, že by si niečo také teraz potreboval.

Ak potrebuješ dostať do selectu hodnoty v poradí money a safename, treba zmeniť hodnotu fetchPairs.
A $arrsafe len predať ako je.

Z DB dostaneš hodnotu, takú ktorú už môžeš rovno vložiť do selectu.

$arrsafe = $this->db->table("safe")
                        ->where("idUser", $this->user->getId())
						->fetchPairs('money', 'safeName');
...
$form->addSelect('safenm', 'Safe:', $arrsafe);

Neviem aké máš názvy stĺpcov v tabuľke, uprav si to podľa seba.

Editoval JakubH (13. 1. 2022 22:18)

mimacala
Člen | 113
+
0
-

No jde mi vlastně o to, že pokud bych chtěl přistupovat do jiného sloupce musím zadat znova připojení na db,

$arrsafe = $this->db->table("safe")
                        ->where("idUser", $this->user->getId())
						->fetchPairs('money', 'safeName');
$arrsafe2 = $this->db->table("safe") // druhé připojení
                        ->where("idUser", $this->user->getId())
						->fetchPairs('id', 'id');
...
$form->addSelect('safenm', 'Safe:', $arrsafe);

což mi přijde jako zbytečně náročné a zatěžující pro server, snažší je udělat jedno spojení a z něj si brát jen data ?
v tom objectu mi to vyhodilo chybu :/

JakubH
Člen | 13
+
0
-

Možné riešenie cez foreach

$data = $this->db->table("safe")->where("idUser", $this->user->getId());

$moneySafe = [];
$userId= [];

foreach($data as $money){
	$moneySafe[$money->money] => $money->safeName;
}

foreach($data as $user){
	$userId[$user->id] => $user->id;
}

Editoval JakubH (13. 1. 2022 22:38)

Kamil Valenta
Člen | 758
+
+1
-

Je nezbytné prostudovat si, co která metoda vrací.
->fetch() vratí ArrayHash právě jednoho záznamu z DB. Pak můžeš přistupovat ke konkrétním sloupcům resultsetu.
Můžeš ho procházet i v cyklu:

$selection = $database->table('test');
while($data = $selection->fetch()) {
    dump($data->id);
    dump($data->name);
    dump($data->safeName);
}

->fetchAll() vrátí pole, položkami jsou ArrayHashe jednotlivých řádků.

$data = $database->table('test')->fetchAll();
foreach($data as $zaznam) {
    dump($zaznam->id);
    dump($zaznam->name);
    dump($zaznam->safeName);
}

->fetchPairs() je jen snadná cesta, jak získat asociativní pole požadovaných párů.

Je tedy důležité vybrat si metodu, která se hodí nejvíce a podle toho s výsledkem nakládat, což nyní neděláš. Po fetchAll() se snažíš přistupovat ke sloupcům konkrétního záznamu a oprávněně dostáváš chybu, že takové atributy pole nemá…

--
EDIT: jen pro úplnost, nejsou to ArrayHashe, ale ActiveRow. Což je zrovna v tomto kontextu jedno…

Editoval Kamil Valenta (14. 1. 2022 12:35)