Pocet zaznamov po spojeni viac tabuliek

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

Zdravim,
chcel by som ziskat pocet zaznamov po joinuti viacerych tabuliek. Chcel by som sa vyhnut priamemu zapisu SQL. Pouzivam nasledujuci kod:

$processingCount() = $this->db->table('queue')->where('status', 'PROCESSING')->fetch()->related('usersQueue')->where('idUser', $idUser)->count();

Problem vsak nastava, pokial v tabulke queue nie je ziaden zaznam so statusom PROCESSING, vtedy vrati chybu Call to a member function related() on a non-object.

Ako to spravit co najjednoduchsie? Dakujem.

David Matějka
Moderator | 6445
+
0
-

predpokladam, ze muze byt vic zaznamu se stavem processing? v tom pripade nemuzes pouzit fetch a related. a jeste jedna vec: nepouzivej metodu count() bez parametru, pokud nevis, co presne ta metoda dela. count bez parametru vytahne vsechny zaznamy a vrati velikost. lepsi je count(‚id‘), kdy to provede spravny dotaz. celkove to bude vypadat asi takhle:

$processingCount = $this->db->table('usersQueue')->where('queue.status', 'PROCESSING')->where('idUser', $idUser)->count('*');
pogo
Člen | 29
+
0
-

Takto by to bolo super, ale teraz mi to dava chybu No reference found for $usersQueue.queue. Pouzivam InnoDB tabulky a DiscoveredReflection tymto sposobom:

public function __construct(Nette\Database\Connection $db)
{
	$this->db = $db;
	$databaseReflection = new \Nette\Database\Reflection\DiscoveredReflection;
	$this->db->setDatabaseReflection($databaseReflection);
}

Ano, moze byt viac zaznamov so statusom PROCESSING, zatial som tuto funkciu pouzival len na zistovanie, ci je aspon jeden taky zaznam, takze na chybu s fetch() som zatial nenarazil:)

EDIT
Zistil som, ze v database cache subore nie su ulozene ziadne referencie medzi tabulkami. Ako presne funguje discovered reflection? Dokaze najst vazby medzi tabulkami na zaklade cudzich klucov v InnoDB?

Editoval pogo (7. 4. 2013 12:13)

pogo
Člen | 29
+
0
-

Uz som na to prisiel. Pokial sa nedodrziavaju konvencie, staci pouzit ako cudziu tabulku nazov cudzieho kluca a uz to ide, cize takto:

processingCount = $this->db->table('usersQueue')->where('idQueue.status', 'PROCESSING')->where('idUser', $idUser)->count('*');

Dolezite je to idQueue, ktore je cudzim klucom v tabulke usersQueue na tabulku queue.