Count a Array to string conversion
- iskejp
- Člen | 41
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 | 817
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)
- iskejp
- Člen | 41
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.
- iskejp
- Člen | 41
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);
}
- jetpack
- Člen | 71
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?