Pocet zaznamov po spojeni viac tabuliek
- pogo
- Člen | 29
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
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
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
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
.