Vkládání do databáze bez nutnosti unsetovat data polí formuláře
- koprkuba
- Člen | 24
PHP: v.5.3.10
Nette: v.2.0.3
Dobrý den / Ahoj,
mám dotaz, který je zpočátku celkem stupidní, ale velice by mi pomohlo jej
vyřešit nějak inteligentně.
Mám registrační formulář ve kterém vyplňuji několik položek, které
se ukládají do tabulky uživatelů, některé do tabulky poštovních adres a
některé se vůbec neukládají.
např:
// vytvoření componenty signInForm
$form->addText('username'); // ukládá se do USER
$form->addText('passwd'); // ukládá se do USER
$form->addText('passwd2'); // neukládá se vůbec jde jen o validaci hesla
$form->addText('street'); // ukládá se do ADDRESS
$form->addText('city'); // ukládá se do ADDRESS
Po úspěšném odeslání jej zpracovávám:
// formSubmitted
$formData = $form->getValues(TRUE);
// unsetnu pole které v DB není
unset($formData['passwd2']);
// tady si ještě data pro adresu ukládám do jiného pole, které pak uložím do databáze do tabulky ADDRESS
// dále je unsetnu
unset($formData['street']);
unset($formData['city']);
a tyto data následně zapíši do databáze:
$user = $this->context->createUsers()->insert($formData);
// P.S. psáno z hlavy jedná se jen o ukázku
Vše funguje, ale chtěl bych abych nemusel tyto hodnoty unsetovat a do databáze by se mi zapsali pouze pole, pro které existuje v databázi sloupec(atribut).
tj. abych dal třídě Users všechna data z formuláře a dotaz by se provedl bez problému, v tuto chvíli pokud odešlu data do databáze, Nette vyhodí vyjímku, že sloupec neexistuje a SQL není možno provést. Ono je to vlastně správně, ale hodnot ve formulářích které se musí unsetovat je poměrně hodně, tak se chci zeptat zda to nejde nějak obejít (vyhnout se několika unsetům po sobě).
- Jan Endel
- Člen | 1016
Kontejnery:
protected createComponentForm() {
$form = new \Nette\Application\UI\Form();
$conData = $form->addContainer('data');
$conData->addText('jmenoDoDb', 'Jméno:');
$form->addText('textMimoDb', 'Text:');
$form->addSubmit('send', 'Odeslat');
$form->onSuccess[] = callback($this, 'formSubmitted');
}
public function formSubmitted(\Nette\Application\UI\Form $form)
{
$vals = $form->getValues();
$this->context->fooModel->saveToDb($vals['data']);
}
- bojovyletoun
- Člen | 667
Samotná metoda na získání sloupců může vypadat takhle. Nebo to můžeš číst z anotací, pokud máš „entity“ --
$a = new \Nette\Database\Connection('mysql:host=localhost;dbname=test', 'root', 'root');
$r = $a->supplementalDriver->getColumns('tablo');
dump($r);