Ako insertovať do dvoch tabuliek cez formulár
- SontoEremo
- Člen | 341
Mám dve tabuľky
Clients
CREATE TABLE `clients` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fullName` varchar(128) COLLATE utf8_bin NOT NULL,
`email` varchar(1024) COLLATE utf8_bin NOT NULL,
`action` varchar(128) COLLATE utf8_bin NOT NULL,
`service` varchar(128) COLLATE utf8_bin NOT NULL,
`dateOrder` varchar(64) COLLATE utf8_bin NOT NULL,
`timeOrder` varchar(64) COLLATE utf8_bin NOT NULL,
`status` varchar(64) COLLATE utf8_bin NOT NULL,
`date_created` varchar(10) COLLATE utf8_bin NOT NULL,
`time_created` varchar(8) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
A Payments
CREATE TABLE `payments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`amount` varchar(7) COLLATE utf8_bin NOT NULL,
`tringelt` varchar(7) COLLATE utf8_bin NOT NULL,
`payment_status` varchar(32) COLLATE utf8_bin NOT NULL,
`clients_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `clients_id` (`clients_id`),
CONSTRAINT `payments_ibfk_1` FOREIGN KEY (`clients_id`) REFERENCES `clients` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Zaujmalo by ma ako insertovať po odoslaní formulára
ak potrebujem vyplniť tabulku Payments tak aby bolo
amount 0,00 – Defaultne
tringelt 0,00 – Defaultne
a clients_id id-čko z tabuľky Clients
- SontoEremo
- Člen | 341
ondrej256 napsal(a):
Pracoval jsi už někdy v nette s databází?
Jakou používáš databázovou vstvu?
Můžeš sem přidat tvůj kód?
Hej ale až tak rozsiahle nie :)
Nette\DB
<?php
namespace App\Presenters;
use Nette;
use Nette\Utils\Html;
use Nette\Utils\Random;
use Nette\Application\UI\Form;
use Nette\Templating\FileTemplate;
use Nette\Latte\Engine;
use Nette\Templating\Helpers;
use App\Repository\ClientsRepository;
use App\Repository\MonthsRepository;
use App\Repository\PaymentsRepository;
class ZanechtujSaPresenter extends CommandPresenter {
/** @persistent */
public $backlink = '';
/** @var MonthsRepository */
public $monthsRepository;
/** @var ClientsRepository */
public $clientsRepository;
/** @var PaymentsRepository */
public $paymentsRepository;
public function __construct(MonthsRepository $monthsRepository, ClientsRepository $clientsRepository, PaymentsRepository $paymentsRepository) {
$this->monthsRepository = $monthsRepository;
$this->clientsRepository = $clientsRepository;
$this->paymentsRepository = $paymentsRepository;
}
public function beforeRender() {
$id = (int) $this->getParameter('id');
$selectMonths = $this->monthsRepository->findAll()
->where(':dates.months_id');
$this->template->Months = $selectMonths;
}
protected function createComponentZanechtujsaForm() {
$form = new Form;
$form->addText('fullName', 'Meno a Priezvisko')
->setRequired('Meno a Priezvisko musí byť vyplnené!')
->setAttribute('class', 'form-control noRadius');
$form->addText('email', 'Emailová adresa')
->setAttribute('class', 'form-control noRadius')
->addRule(Form::EMAIL, 'Zadajte platnú emailovú adresu!');
$actions = [
'Klasická objednávka',
'Akcia Nevesta',
'Oslávenkyňa'
];
$form->addSelect('action', 'Akcia', array_combine($actions, $actions))
->setAttribute('class', 'chosen-select noRadius');
$services = [
'Gelové nechty',
'Akrilové nechty',
'Doplnenie'
];
$form->addSelect('service', 'Služba', array_combine($services, $services))
->setAttribute('class', 'chosen-select noRadius');
$form->addText('dateOrder', 'Dátum objednania')
->setAttribute('class', 'form-control noRadius')
->setAttribute('id', 'date')
->setRequired('Dátum objednania musí byť vyplnený!');
$times = [
'09:00 - 11:00',
'13:00 - 15:00',
'15:00 - 17:00'
];
$form->addSelect('timeOrder', 'Čas', array_combine($times, $times))
->setAttribute('class', 'chosen-select noRadius');
$form->addSubmit('sendForm', 'Odoslať');
$form->onSuccess[] = $this->zanechtujsaFormSuccessSubmitted;
$form->elementPrototype->novalidate("novalidate");
return $form;
}
public function zanechtujsaFormSuccessSubmitted(Form $form, $id = 0) {
$values = $form->getValues();
$values->orderID = Random::generate(7, '0-9');
$values->date_created = date('d.m.Y');
$values->time_created = date('H:i:s');
$values->status = 'Pending';
$values->amount = '0,00';
$values->tringelt = '0,00';
$values->payment_status = 'Neuhradené';
$this->clientsRepository->insert($values);
$values->amout = '0.00';
$values->tringelt = '0.00';
$values->payment_status = 'Neuhradené';
$values->clients_id = $this->clientsRepository->findAll()
->where(':payments.clients_id');
$values->paymentsRepository->insert($values);
$orderID = $values->orderID;
$fullName = $values->fullName;
$email = $values->email;
$action = $values->action;
$service = $values->service;
$dateOrder = $values->dateOrder;
$timeOrder = $values->timeOrder;
$this->flashMessage(
array(
'orderID' => $orderID,
'fullName' => $fullName,
'email' => $email,
'action' => $action,
'service' => $service,
'dateOrder' => $dateOrder,
'timeOrder' => $timeOrder
), 'success');
$this->redirect(':ZanechtujSa:success');
}
}
- SontoEremo
- Člen | 341
David Matějka napsal(a):
metoda insert ti vrati radek s vlozenym zaznamem, takze i id
Prepáč ale teraz nerozumiem…
- newPOPE
- Člen | 648
@SontoEremo a nezabudni si tie inserty obalit transakciou.
- https://api.nette.org/…ext.php.html#… (begin, commit, rollback).
- SontoEremo
- Člen | 341
newPOPE napsal(a):
@SontoEremo a nezabudni si tie inserty obalit transakciou.
- https://api.nette.org/…ext.php.html#… (begin, commit, rollback).
Myslíš tým toto?
$client = $this->database->table('clients')->beginTransaction()->insert(array(...));
$payment = $this->database->table('payments')->beginTransaction()->insert(array('clients_id' => $client->id, ...));
- Zuben45
- Člen | 268
newPOPE napsal(a):
@SontoEremo a nezabudni si tie inserty obalit transakciou.
- https://api.nette.org/…ext.php.html#… (begin, commit, rollback).
mohu se zeptat k čemu je ta transakce ? NetteDB používám, ale toto jsem ještě nevyužil. Díky :)
- Vastlik
- Člen | 58
@Zuben45 Transakce proběhne celá nebo vůbec, tzn. pokud by jsi byl
banka a někdo by zaplatil, peníze by to odečetlo. Najednou by se něco
pokazilo (spadl server apod.), tak by nenastalo přičtení do druhého účtu,
čímž by jsi nezaplatil, i když by byly peníze odečteny.
Když použiješ transakce, a např. server spadne, vrátí se to předešlého
stavu před transakcí.
Editoval Vastlik (18. 12. 2015 16:11)
- Zuben45
- Člen | 268
Vastlik napsal(a):
@Zuben45 Transakce proběhne celá nebo vůbec, tzn. pokud by jsi byl banka a někdo by zaplatil, peníze by to odečetlo. Najednou by se něco pokazilo (spadl server apod.), tak by nenastalo přičtení do druhého účtu, čímž by jsi nezaplatil, i když by byly peníze odečteny.
Když použiješ transakce, a např. server spadne, vrátí se to předešlého stavu před transakcí.
aha, tak to je chytrý, díky moc za vysvětlení, odteď to budu používat everyDay :), by se možná i šiklo dát do dokumentace :)
Editoval Zuben45 (18. 12. 2015 17:21)