Továrničky odvozené od \Nette\Database\Connection a práce s DB
- kedrigern
- Člen | 102
Zdravím,
mám klasickou továrničku odvozenou od \Nette\Database\Connection . Používám jí jako v Sandboxu.
Dále jsem také použil např. (továrnička se jmenuje userfactory):
$this->context->createUserfactory()->where('nick', $values->username)->update(array('last_visit' => date("Y-m-d H:i:s")));
Popřípadě:
$row1 = $this->context->createAddress()->insert(array('name' => $this->formvalues['name'],));
Tyto příklady mi fungují. Ale pak jsem zkusil:
$this->context->createAuthor()->where('id', '5')->update(array( ... ));
A to nefuguje. je to někdo zdokumentované? Dělám něco špatně?
- kedrigern
- Člen | 102
No funguje to tak, že se přidá zcela nový řádek do tabulky (s požadovanými hodnotami).
Ale teď jsem dokonce používal:
$this->context->createAuthor()->where('id', '5')->update(
array(
'title_before' => $values['titlebef'],
'name' => $values['name'],
'surname' => $values['surname'],
'title_after' => $values['titleafter'],
'description_texy' => $values['description'],
'description_html' => $this->context->texy->process($values['description']),
)
);
Zkoušel jsem i 5 bez apostrofů. Samozřejmě jinak tam mám proměnnou. 5 je existující záznam.
Není mi to vůbec jasné a tohle vkládání jsem zkoušel metodou pokus omyl. Takže bych si rád přečetl nějakou dokumentaci. Napadlo mě, že to id bere nějak jinak a je třeba použít něco jako:
$this->context->createAuthor()->get($id)->insert()
Ale to mi také při letmém pokusu nefungovalo (nicméně možná byla chyba jinde).
- ViPEr*CZ*
- Člen | 817
No nechápu furt co to dělá a proč nebo jak to nefunguje???
Jináč v dokumentaci (či API) je dobrý popis. Osobně používám
tento zápis:
->where('id = ?', 5)
Navíc je dost dobré používat try…catch() a pokud to při update spadne, ošetřit si právě vyhozenou vyjímku PDOException.
- ViPEr*CZ*
- Člen | 817
Pokud je sloupec v databázi pojmenovaný jako id a existuje řádek právě
s id = 5, pak po where by to mělo vracet opět
Nette\Database\Table\Selection.
A ta má metodu update, krerá INSERT rozhodně neudělá, když se na to
koukám. Takže zakopaný pes bude u Vás. Projde to vůbec přes ten update?
Jakej SQL to generuje?
- kedrigern
- Člen | 102
Omlouvám se, už jsem si všiml co to je. Problém je, že se volá špatná submit funkce z formuláře. Snažil jsem se udělat komponentu, která dynamicky reaguje na stav presenteru, přibližně takto:
class AuthorPresenter extends BasePresenter
{
public $id = NULL;
protected function createComponentAuthorAdd()
{
$form = new Form;
$form->addText("name", "Jméno:");
if( is_numeric( $this->id ) ) {
try {
$row = $this->context->createAuthor()->get( $this->id );
if( !$row ) throw new \Exception('DB error / neexistující id: '.$this->id);
$form->setDefaults( array(
'name' => $row['name'],
));
} catch (\Exception $e) {
$this->flashMessage("Něco se pokazilo.", 'alert-error');
$this->setView('add');
}
$form->addSubmit("send", "Uložit");
$form->onSuccess[] = callback($this, "authorEditSubmitted");
} else {
$form->addSubmit("send", "Přidat nového autora");
$form->onSuccess[] = callback($this, "authorAddSubmitted");
}
return $form;
}
}
Jde o to, že formulář má asi 15 položek s dodatečnými podmínkami. Liší se pouze tlačítko pro odeslání a to zda se volá update, nebo insert.
Předpokládám, že problémem je, že se formulář nějakým způsobem cachuje či co. Zobrazí se mi správně jiné potvrzovací tlačítko, ale funkci to vykoná stejnou (obojí insert).
Poradíte mi tedy, jak takovou komponentu vyrobit?
- bojovyletoun
- Člen | 667
asi nepředáváš žádné id v odkazu… Schválně, když se podíváš do logu/konzolo/firebugu/dragonfly, tak requset nebude mít id…
Jedna z možností je označit $id anotací persistent.
Pro hotové řešení se podívej sem (jak předávat id a
výchozí data pro editační formulář.) pro hotové řešení
- kedrigern
- Člen | 102
Velmi všem děkuji. Dle tohoto návodu: https://doc.nette.org/…editing-form šlo vše hladce.