chyba Cannot read an undeclared property Nette\Database\Table\Selection::$sberatel_jmeno
- Mirek
- Člen | 86
Tak jsem narazil na další problém. Objevila se mi výše uvedená chyba a nemohu přijít na to proč.
- Mám v config.neon službu
- App\Model\UzivatelRepository
- Třída Uzivatelrepository vypadá takto
namespace App\Model;
use Nette;
class UzivatelRepository
{
use Nette\SmartObject;
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function najdiUzivatele($uzivatel_jmeno)
{
return $this->database->table('tb_sberatele')->select('sberatel_jmeno')->where('sberatel_jmeno', $uzivatel_jmeno);
}
a presenter, kde se snažím načíst uživatele jestli existuje:
namespace App\Presenters;
use Nette;
use Nette\Application\UI;
class PrihlaseniPresenter extends BasePresenter
{
/** @var \App\Model\UzivatelRepository */
private $UzivatelRepository;
public function injectUzivatelRepository(\App\Model\UzivatelRepository $UzivatelRepository1)
{
$this->UzivatelRepository = $UzivatelRepository1;
}
protected function createComponentNovyUzivatelForm()
{
$form2 = new UI\Form;
$form2->addText('prihlasovaci_jmeno', 'Jméno:')
->setRequired('Vyplňte vaše přihlašovací jméno - rozlišuje velká a malá písmenka.');
$form2->addPassword('prihlasovaci_heslo', 'Heslo:')
->setRequired('Vyplňte vaše heslo - rozlišuje velká a malá písmenka.')
->addRule(UI\Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaky', 3);
$form2->addText('prihlasovaci_email', 'Email:')
->setRequired('Vyplňte váš email.')
->addRule(UI\Form::EMAIL, 'Vyplnil(a) jste neplatnou emailovou adresu');
$form2->addSubmit('tl_prihlasit', 'vytvořit účet');
$form2->onSuccess[] = [$this, 'novyUzivatelFormSucceeded'];
return $form2;
}
/** @var \Nette\Database\Table\ActiveRow */
private $u;
public function novyUzivatelFormSucceeded($form2, $values)
{
$u=$this->UzivatelRepository->najdiUzivatele($values->prihlasovaci_jmeno);
if ($u->sberatel_jmeno == $values->prihlasovaci_jmeno) {
$form2->addError('Tento uživatel zde již existuje. Zvolte si jiné uživatelské jméno.');
}
}
}
A chyba se objevuje na řádku, kde chci pracovat s $u->sberatel_jmeno
Hledal jsem na fóru a našel jsem rady jako že chybí annotace, což si myslím, že mám dobře, případně že je dobré přidat explicitní výběr sloupců, což jsem tam zkusil přidat a nepomohlo to. Takže mě došly nápady, kde hledat chybu.
Editoval Mirek (21. 9. 2016 10:43)
- Oli
- Člen | 1215
Chybí ti tam fetch()
return $this->database->table('tb_sberatele')
->select('sberatel_jmeno')
->where('sberatel_jmeno', $uzivatel_jmeno)
->fetch();
Selection si můžeš představit jako pole. Musíš ho
prohnat foreachem. Pokud chceš pracovat s jedním záznamem, musíš zavolat
metodu fetch
, která vrací ActiveRow a na něm
pak můžeš zavolat $u->sberatel_jmeno
Editoval Oli (21. 9. 2016 10:55)
- Muhahe
- Člen | 79
V tutorialech je casto pouzity nejaky cyklus na iteraci dat, ktery si vola fetch() sam. Pokud chces data pouze vratit a s necim porovnat, musis ten fetch() zavolat rucne. Myslim ze se to nazyva lazyLoading?
Mirek napsal(a):
Díky to pomohlo, jen v dokumentaci jsem nikde to fetch() neviděl použít.