Továrničky odvozené od \Nette\Database\Connection a práce s DB

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

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ě?

ViPEr*CZ*
Člen | 817
+
0
-

Jak to nefunguje? Píše to nějakou chybu?

kedrigern
Člen | 102
+
0
-

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
+
0
-

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.

kedrigern
Člen | 102
+
0
-

Přepsal jsem to na:

->where('id = ?', 5)

a stále mi to přidává nové řádky (namísto aktualizace řádku s id 5 se do DB korektně přidá nový řádek s novým id.).

Mimochodem, co znamená ten otazník? Za něj se doplní druhý argument?

jtousek
Člen | 951
+
0
-

Podívej se do debug baru jaký SQL dotaz to vygenerovalo.

ViPEr*CZ*
Člen | 817
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Podívám se na to.

Nicméně předávání parametru mi nefugovalo. Tak si parametr udržuji v proměnné presenteru. A dle všeho to funguje. Např. jednou se mi zobrazí tlačítko „uložit“, podruhé (na jiném view) tlačítko „přidat nový záznam“. Akorát ta metoda se vždy volá ta jedna.

kedrigern
Člen | 102
+
0
-

Velmi všem děkuji. Dle tohoto návodu: https://doc.nette.org/…editing-form šlo vše hladce.