addSelect obsah db zobrazuje chybu
- mimacala
- Člen | 113
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 | 822
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…
- JakubH
- Člen | 13
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
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
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
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
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 | 822
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)