Ako správne získavať data z riadku tabuľky?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lime
Člen | 55
+
0
-

Ahoj, minule som tu založil tému kde mi vrátené data z tabuľky nepoznali 1 stlpec keď som použil niečo takéto:

$row = $this->pripojenie->table('users')->fetch();
  • fungovalo to, keď som to zmenil na:
$ro = $this->pripojenie->table('users')->get($riadok_tabuľky);

Aký je medzi týmito 2 funkciami rozdiel? (teda okrem toho, že tá prvá mi nejako nefunguje :) ), a chcem sa ešte opýtať ako získať riadok tabuľky (nap. podľa username) lebo get() má povinný parameter, takže niečo takéto nefunguje:

$row = $this->pripojenie->table('users')->where('username', $username)->get();

Ja by som nejako potreboval dostať id riadku (teda užívateľa) do parametra funkcie get, ale neviem ako, ďakujem za objasnenie :)

Editoval lime (9. 12. 2013 23:11)

factor
Člen | 28
+
0
-

Hoj hoj,
sice asi nejsem ta nejkopetentnější osoba ale co už :)

$row = $this->pripojenie->table('users')->fetch();

Vrátí vše s limitem 1

$ro = $this->pripojenie->table('users')->get($riadok_tabulky);

Získá řádek s primárním klíčem $riadok_tabulky

$row = $this->pripojenie->table('users')->where('username', $username);

Pokud chceš získat pomocí where vynech ->get()

nebo pro víc argumentů

$array = array(
	'username'	=> 'Jenda',
	'age'		=> 18
	);
$row = $this->pripojenie->table('users')->where($array);

Snad nekecám :)

Update
Zapoměl jsem odpovědět na tvou otazku k ziskani ID

$id = $this->pripojenie->table('users')->get($riadok_tabulky)->id;

Editoval factor (10. 12. 2013 9:05)

lime
Člen | 55
+
0
-

Toto bude poznať iba stlpec username

$row = $this->connection->table('users')
                    ->where('username', $username);

A k tomu id, ja to potrebujem preto aby som to dal do argumentu funkcie get(), niečo takéto mi nejde:

$id = $this->connection->table('users')
                    ->where('username', $username)
                    ->get('id');
if(!$id) { //nepozná $id
                throw new NS\AuthenticationException();
            }
$row = $this->connection->table('users')
                    ->get($id);
elevate
Člen | 31
+
0
-
$selection = $this->connection->table('users')
                    ->where('username', $username);

Toto ti vrátí Selection (můžeš si to představit jako chytřejší pole řádků tabulky). Když chceš pouze jeden, tak můžeš požádat o první řádek z výsledku

$row = $selection->fetch();

Nebo celý seleciton vypsat v cyklu

foreach($selection as $row){
	echo $row->username;
	echo $row->id;
}

$row obsahuje celý řádek, nemusíš zpřesňovat, které sloupce chceš vrátit. Pokud ti tam nějaký chybí, tak smaž cache, protože NDB si ukládá, které sloupce má vrace.

Pokud bys přesto chtěl zpřesnit, jaké sloupce chceš, tak můžeš takto:

$selection = $this->connection->table("users")->select(array("id", "username"))->where("username", $username);

E.

Oli
Člen | 1215
+
0
-

Lime prvni pripad nahraje celou tabulku, ne jen sloupec username. To co ty chces delat nechapu. Proc chces id, ktere potom vlozis do stejne tabulky? podle me zbytecnej dotaz navic…

lime
Člen | 55
+
0
-

Potreboval som iba vrátiť všetky stlpce z riadku tabuľky, už som to vyriešil takto:

$row = $this->connection->table('users')
                    ->select('*')
                    ->where('username', $username)
                    ->fetch();

Po dlhom čase som začal robiť s databázou a zabudol som tam dať ten select(‚*‘) takže $row nepoznala všetky stlpce, to bol môj problém, ale už to je vyriešené, diky

factor
Člen | 28
+
0
-

Hoj Lime,

pokud budeš mít např tuhle tabulku (users):

id name surname email
1 Zdeněk Novák test1@example.com
2 Jaroslav Novák test2@example.com

tak dotaz bude vypadat takhle:

$row->db->table("users")->where("name", "Zdeněk");

a pokud budeš chtít získat nějaká data z toho řádku tak potom už jen (pozor aby ti to nevytáhlo více řádků, potom by byl tenhle zápis špatně a musel by jsi to projet pomocí např foreach):

$row->id;
$row->name;
$row->surname;

asi tě plete metoda ->get($id), (jak jsem psal) ta dělá jen to že v DB vybere řádek kterej má primární klíč roven předanému parametru.

Nic složitého a ještě ti to ulehčí práci :)

Editoval factor (10. 12. 2013 12:50)

Oli
Člen | 1215
+
0
-

lime napsal(a):

$row = $this->connection->table('users')
                    ->select('*')
                    ->where('username', $username)
                    ->fetch();

Ten select tam je navíc. Respektive může a nemusí tam být…

Šaman
Člen | 2666
+
0
-

Myslím, že není. Pokud si dobře pamatuji na práci s NDb, tak bez toho selectu se to snaží predikovat které sloupce se budou tahat (takže to načte v minimálním případě jen id), zatímco s tím selectem to stáhne celý řádek i s daty, přestože možná nebudou potřeba.

lime
Člen | 55
+
0
-

Šaman má pravdu, ja som tam doteraz nedával select a jeden stlpec mi to nepoznalo, mal som asi takú tabuľku ako urobil factor, a takýto dotaz:

$row->db->table("users")->where("name", "Zdeněk");

poznal iba stlpce id a name, mal som niečo podobné, a keď som nejako v podmienke where() nespomenul stlpec tak ho potom nepoznalo, preto som musel selectom vybrať stlpce, ktoré som potreboval

Editoval lime (10. 12. 2013 14:27)

Oli
Člen | 1215
+
0
-

Šaman: Ano, to máš pravdu. Problem je, že pokud ho nepoužije, tak na co ten nevyužitej sloupec tahat? Kdybych měl uvést příklad, jak to používám, tak:

$row = $this->connection->table('users')->where('name' 'Zdeněk')->fetch();

$row // stáhne pravděpodobně jen id a name
$row->email // stáhne id, name, email
$row->role->name // stáhne id, name, (tady jen tipuju) role_id, role.name
...

Takhle to používám a neměl jsem jedinkrát problém. Jestli to opravdu stahuje jen takhle jen tipuju. Takže ano, není to jedno, ale z hlediska přístupu ke sloupcům to jedno je… :-)

lime: napadlo mě, jaké používáš úložiště? Doporučovaný je InnoDB, kvuli cizím klíčům. Teoreticky tohle může dělat problém nebo jsi měl nacachovány 2 sloupce a ty jsi chtěl 3.

lime
Člen | 55
+
0
-

Oli napsal(a):

lime: napadlo mě, jaké používáš úložiště? Doporučovaný je InnoDB, kvuli cizím klíčům. Teoreticky tohle může dělat problém nebo jsi měl nacachovány 2 sloupce a ty jsi chtěl 3.

Áno, používam InnoDB a cache som tiež vymazával, ale v tom nebol problém, no už používam selecty a viem si pekne vybrať stlpce, ktoré potrebujem

romiix.org
Člen | 343
+
0
-

Ide o to, že ak nepoužiješ select, nemusíš si vyberať stĺpce ktoré potrebuješ, ale NDB to optimalizuje samo. Je to proste zbytočnosť. (Ak všetko funguje ako má)

lime
Člen | 55
+
0
-

Aháááá :) no problém je, že u mňa to nefunguje ako má, teda tento kód nepozná stlpec role pri vracaní novej identity:

function authenticate(array $credentials)
    {
            list($username, $password) = $credentials;

            $row = $this->connection->table('users')
                    ->where('username', $username)
                    ->fetch();

            if(!$row) {
                    throw new NS\AuthenticationException();
            }

            if($row->password !== (sha1($password."A45xOm"))) {
                    throw new NS\AuthenticationException();
            }

            return new NS\Identity($row->id, $row->role); //$row->role nepozná
    }
romiix.org
Člen | 343
+
0
-

lime napsal(a):

Daj sem export tabuľky users, alebo ideálne celú DB. (pastebin)

lime
Člen | 55
+
0
-

romiix.org napsal(a):

lime napsal(a):

Daj sem export tabuľky users, alebo ideálne celú DB. (pastebin)

takýto export alebo ako si to myslel? :)

INSERT INTO `users` (`id`, `username`, `password`, `role`, `register_date`) VALUES
(1,	'lime',	'fde955e73998719e0a85a07ce0f9f08f59a3a8a1',	'member',	'2013-12-08 13:49:03'),
(2,	'honza',	'd00a5d0fb8d645369cbe7829d818d4ed7dbc53e0',	'member',	'2013-12-10 09:55:01');

alebo: http://pastebin.com/zS9TjDm7

Editoval lime (10. 12. 2013 16:30)

romiix.org
Člen | 343
+
0
-

Myslel som export štruktúry tabuliek, ale aj toto postačilo.

Skutočne by to takto malo fungovať. Možno by stálo za to otestovať to na čistom sandboxe.

lime
Člen | 55
+
0
-

keď tak ešte obrázok: http://screenshot.cz/EN9NG/

  • ja to skúsim niekedy zajtra na novom sandboxe, teraz nemám čas