Jak spravne pracovat s modelem?
- pepelopez
- Člen | 9
Ahoj,
mam takovy zakladni dotaz. Procitam si quickstart a neni mi moc jasne, jak
pracovat s modely. Jde konkretne o tento clanek:
https://doc.nette.org/cs/quickstart
vytvoril jsem si model Users:
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Users extends Selection
{
public function __construct(Connection $connection)
{
parent::__construct('user', $connection);
}
}
a ted chci vybrat vsechny uzivatele, kteri maji status = active. Asi neco delam spatne, tak budu rad, kdyz mi poradite. V modelu mam tedy:
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Users extends Selection
{
public function __construct(Connection $connection)
{
parent::__construct('user', $connection);
}
public function getActive(){
return $this->where('status', 'active');
}
}
a v presenteru:
public function renderDefault(){
$this->template->activeUsers = $this->context->createUsers->getActive();
}
Potom ale chci predat do sablony dalsi pole uzivatelu, tentokrat ti, kteri jsou aktivni a zaroven maji vyplnen email. Takze do modelu pridam:
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Users extends Selection
{
public function __construct(Connection $connection)
{
parent::__construct('user', $connection);
}
public function getActive(){
return $this->where('status', 'active');
}
public function getActiveWithEmail(){
return $this->where('status', 'active')->where('email != ?', '');
}
}
a presenter upravim takto:
public function renderDefault(){
$this->template->activeUsers = $this->context->createUsers->getActive();
$this->template->activeUsersWithEmail = $this->context->createUsers->getActiveWithEmail();
}
a ted si to v sablone chci vypsat takto:
Vsichni aktivni:
{foreach $activeUsers as $item}
{$item->name}<br />
{/foreach}
Vsichni aktivni, kteri maji vyplneny email:
{foreach $activeUsersWithEmail as $item}
{$item->name}<br />
{/foreach}
A problem je v tom, ze jak data jsou naprosto stejna… V obou iteracich se mi vypise stejny (i obsahove stejny) pocet dat.
Kde delam chybu? Je problem v tom, ze nejdrive vyberu vsechny aktivni a pri dalsim volani modelu chci vybrat vsechny s vyplnenym emailem a tato podminka se mi aplikuje na 1. dotaz? Vypada to tak.
Dekuji za tipy a za rady.
- castamir
- Člen | 629
Předpokládám, že špatně je ten druhý „where“, který je nekorektní dotaz vzhledem k mysql. Zkus
public function getActiveWithEmail(){
return $this->where('status', 'active')->where('email IS NOT NULL');
}
Každopádně při testování v debugbaru máš všechny queries, tak podívej, co se ti to udělalo za dotaz…
- Glottis
- Člen | 129
proc by mel ten where spatne? prijdemi to korektni. treba do db null nepise ale prazdy retezec. a pak to zafunguje. pepelopez to sice nenapsal, ale asi mu to vraci data toho druheho dotazu. i ten prvni. protoze $this->context->createUsers mu nejspis vrati stejny objekt a ne novou instanci
- castamir
- Člen | 629
já si nemyslím, že mu to vrací stejnou instanci – to by si mohl vyzkoušet tak, že tu metodu bude mít např. takto:
public function getActiveWithEmail(){
return $this->where('email != ?', '');
//return $this; alternativa k otestování
}
Já mám totiž podezřejní, že mu bude dělat problém ten druhý parametr prázdného stringu…
- JuniorJR
- Člen | 181
Glottis napsal(a):
… $this->context->createUsers mu nejspis vrati stejny objekt a ne novou instanci
Má pravdu ten chlapec, používá to jako service, takže mu to vrací pořád stejný objekt. Řešením může být zaregistrování daného modelu v sekci factories, jak už dříve někdo zmínil a je to tak, tuším, i v quickstartu.
Editoval JuniorJR (23. 5. 2012 7:29)