Ako insertovať do dvoch tabuliek cez formulár

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

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

ondrej256
Člen | 187
+
0
-

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?

Editoval ondrej256 (15. 12. 2015 20:57)

SontoEremo
Člen | 341
+
+1
-

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');
	}
}
David Matějka
Moderator | 6445
+
0
-

metoda insert ti vrati radek s vlozenym zaznamem, takze i id

SontoEremo
Člen | 341
+
0
-

David Matějka napsal(a):

metoda insert ti vrati radek s vlozenym zaznamem, takze i id

Prepáč ale teraz nerozumiem…

Mysteria
Člen | 797
+
0
-

@SontoEremo: Když používáš NDBT a voláš metodu insert, tak ti rovnou selectne vložený řádek.

$client = $this->database->table('clients')->insert(array(...));
$payment = $this->database->table('payments')->insert(array('clients_id' => $client->id, ...));
newPOPE
Člen | 648
+
0
-

@SontoEremo a nezabudni si tie inserty obalit transakciou.

SontoEremo
Člen | 341
+
0
-

newPOPE napsal(a):

@SontoEremo a nezabudni si tie inserty obalit transakciou.

Myslíš tým toto?

$client = $this->database->table('clients')->beginTransaction()->insert(array(...));
$payment = $this->database->table('payments')->beginTransaction()->insert(array('clients_id' => $client->id, ...));
Mysteria
Člen | 797
+
+1
-

Takhle:

$this->database->beginTransaction();
$client = $this->database->table('clients')->insert(array(...));
$payment = $this->database->table('payments')->insert(array('clients_id' => $client->id, ...));
$this->database->commit();
Zuben45
Člen | 268
+
0
-

newPOPE napsal(a):

@SontoEremo a nezabudni si tie inserty obalit transakciou.

mohu se zeptat k čemu je ta transakce ? NetteDB používám, ale toto jsem ještě nevyužil. Díky :)

Vastlik
Člen | 58
+
0
-

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

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)

CZechBoY
Člen | 3608
+
+1
-

Vvdokumentaci kazdyho databazovyho systemu to je…

CZechBoY
Člen | 3608
+
+1
-

Proč by Nette dokumentace měla dokumentovat cizí systémy?