Count a Array to string conversion

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

Zdravím, dovolte zase jednou jeden začátečnický dotaz. Potřebuji v šabloně vypsat počet načtených položek z DB. Proto použiji v komponentě $this->template->countFiles = count($this->fileManage);.Výsledkem je chyba „Array to string conversion“. Vím co to znamená, jen nevím jak docílit toho, aby se do count() předal string místo pole.

Celá komponenta je zde:

class FileManageControl extends Control {

    private $fileManage;

    public function __construct(Selection $manageFiles){
        parent::__construct();
        $this->fileManage = $manageFiles;
    }

    public function render(){
        $this->template->setFile(__DIR__.'/FileManage.latte');
        $this->template->file = $this->fileManage;
        $this->template->countFiles = count($this->fileManage);
        $this->template->render();
    }

Presenter odkud se volá:

protected function createComponentFileManage() {

       return new \AdminModule\FileManageControl($this->articleFileRepository->findFileUse($this->sessionArticle->articleId));
   }

Díky za pomoc.

ViPEr*CZ*
Člen | 814
+
0
-
public function render(){
        $this->template->setFile(__DIR__.'/FileManage.latte');
        $this->template->file = $this->fileManage;
        $this->template->countFiles = $this->fileManage->count();
        $this->template->render();
}

Co se podívat do API? Pokud je $this->fileManage instance Nette\Database\Table\Selection, pak má metodu count.

Editoval ViPEr*CZ* (15. 12. 2012 21:25)

enumag
Člen | 2118
+
0
-

To by nemělo mít význam protože implementuje rozhraní \Countable takže při volání count($selection) se stejně zavolá $selection->count().

iskejp
Člen | 41
+
0
-

ViPErCZ napsal(a):

public function render(){
        $this->template->setFile(__DIR__.'/FileManage.latte');
        $this->template->file = $this->fileManage;
        $this->template->countFiles = $this->fileManage->count();
        $this->template->render();
}

Co se podívat do API? Pokud je $this->fileManage instance Nette\Database\Table\Selection pak má metodu count.

Díky! Problém nakonec bude jinde. Nedaří se mi získat data z tabulky přes JOIN. Mám v DB totiž vztah tabulek N:M, kdy se snažím získat soubory příslušející k danému článku. Každý článek může mít přiřazeno více souborů a soubor samozřejmě může být přiřazen více článkům.

Přes Repository mám vytvořen dotaz, kdy ve where(‚file.id=‘.$articleId) se dotazuji na tabulku souborů přes tabulku filearticle, která spojuje tabulku article a file přes ID.

Snad to je z popis alespoň trochu jasné. Bohužel tento dotaz končí tím, že nedostanu žádná data a proto cout() získá jen array. Bylo by možné poradit jak ten dotaz do DB položit?

Ještě jednou díky.

ViPEr*CZ*
Člen | 814
+
0
-

@enumag: ach ano… vidíš to, kdybych si to jen vše pamatoval :-)
@iskejp: pošli toho víc… jak to teď máš?

Editoval ViPEr*CZ* (16. 12. 2012 2:13)

iskejp
Člen | 41
+
0
-

Ok, zkusím to. Ještě jsem s tím laboroval, protože si myslím, že Nette nezvládne spojení 3 tabulek v N:M vazbě, ale nepodařilo se mi to rozběhnout i přes plný SELECT. Buď jsem se dostal k hlášení No reference found for $articleFile->articlefile., nebo Array to string conversion.

1. DB a výsledek
Potřebuji propojit data z tabulek article (id), articlefile (article_id, file_id) a file (id).

2. Komponenta ManageFile

class FileManageControl extends Control {

    private $fileManage;

    public function __construct(Selection $manageFiles){
        parent::__construct();
        $this->fileManage = $manageFiles;
    }

    public function render(){
        $this->template->setFile(__DIR__.'/FileManage.latte');
        $this->template->file = $this->fileManage;
        $this->template->countFiles = $this->fileManage->count(); **<- zde hlášena chyba**
        $this->template->render();
    }

}

3. ArticlePresenter volá komponentu

protected function createComponentFileManage() {

       return new \AdminModule\FileManageControl($this->articleFileRepository->findFileUse($this->sessionArticle->articleId));
   }

4. ArticleFileRepository

Zde je potencionální místo chyby. Podotýkám, že jsem dotaz zkoušel nad databází a fungoval, nebo alespoň jeho obdoba.

class ArticleFileRepository extends Repository
{
    public function insertFile ($data)
        {
            return $this->insertData($data);
        }

   public function findFileUse ($articleId)
        {
            return $this->findJoin('* FROM articlefile INNER JOIN article ON article.id = '.$articleId.' INNER JOIN file ON file.id = articlefile.file_id','articlefile.article_id = '.$articleId);
        }

}

5. Repository

Tady si nejsem jist, zda by to nebylo řešitelné chytřeji.

public function findJoin($select, $where)
       {
           return $this->getTable()->select($select)->where($where);
       }
petr.pavel
Člen | 535
+
0
-

Není $this->sessionArticle->articleId pole?

iskejp
Člen | 41
+
0
-

petr.pavel napsal(a):

Není $this->sessionArticle->articleId pole?

Podle mého není. Je to ID článku předané pomocí signálu z odkazu.

jetpack
Člen | 71
+
0
-

V Dibi by jsi použil jenom:

<?php
	$db->select('COUNT(pole)')->from('table')->fetchSingle();
?>

Zkus pouvažovat nad Dibi pokud to je možné.
Jinak v Nette\Database není nic takového?

Zdá se mi, že ti to opravdu vrací pole. Zkoušel sis ten SQL vygenerovaný dotaz hodit do Adminera nebo phpmyadmin a podívat se co ti to vyhodilo za výsledek?