Jak spravne pracovat s modelem?

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

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.

Glottis
Člen | 129
+
0
-

a mas to v neonu v sekci factories?

castamir
Člen | 629
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

castamir
Člen | 629
+
0
-

Tak ještě něco bych vyzkoušel – dodat závorky za createUsers:

$this->template->activeUsersWithEmail = $this->context->createUsers()->getActiveWithEmail();

a pak opravdu zkontrolovat ten konfigurák, jak píše kolega předemnou

Editoval castamir (23. 5. 2012 7:36)