Join dat z 2 tabulky s podminkou na joinuté ->where()
- Koupilsemto
- Člen | 38
Zdravím, vytvořil jsem tabulku do které zobrazuji cyklem data joinuta ze 2 tabulek. A chtel bych zobrazovat pouze knihy kde je stav == Rezervovano
<tr n:foreach="$log as $logs" class="post">
<td>{$logs->ref('knihy', 'ID_knihy')->ev_cislo}</td>
<td>{$logs->ref('knihy', 'ID_knihy')->prace}</td>
<td>{$logs->ID_users}</td>
**<td>{$logs->ref('knihy', 'ID_knihy')->stav}</td>**
</tr>
Chtěl bych vytvořit neco takoveho pokud je to možné:
$this->template->log = $this->database->table('log')
->where('stav = ?', 'Rezervováno')
tohle však skončí chybou Unknown column ‚stav‘ in ‚where clause‘. Za reakce děkuji a pěkný den!
- Koupilsemto
- Člen | 38
Nevím jak to nejlépe zobrazit strukturu udělal jsem screen 1 vetší je tabulka knihy 2 je log. usp=sharing"":https://drive.google.com/…YsqDjuo/view?…
Zkusím popsat o co se snažím… Mam uložený seznam
knih a např. při objednání se má zapsat do log kdo jí
chce,kdy a jestli šlo o Rezervování nebo vypůjčení(uloženo v log
ID_user,akce,date).
A zároveň aby se změnil stav knihy v tabulce knihy zda je
rezervovaná nebo vypučena.
To cca funguje ale problém nastává když si chci zobrazit všechna data z log do tabulky kde je stav =‚Dostupná‘ nebo „Rezervováno“.
->where('akce = ?', 'Vypůjčená')
tak zobrazím vše kde je Vypůjčená ve sloupci akce v tabulce log. Ale potřeboval bych zobrazit pouze log který je aktuální a má stejnou akci v log jako stav v tabulce knihy a který je aktuální.
Editoval Koupilsemto (5. 5. 2018 18:35)
- andros
- Člen | 145
Jestli tě správně chápu, chceš vypsat seznam knih, které mají stav „dostupná“ nebo „rezervováno“. Proč se ale k tomu chceš dostat přes tabulku log ? Tabulka log je historie akcí knihy. Takže jeden stav může být v tabulce log několikrát. Připadá mi, že to řešíš zbytečně složitě.
Pokud tě zajímají knihy které mají aktuální stav Rezervováno nebo Objednáno, můžeš je vypsat klasicky přes tabulku knihy.
$this->database->table('knihy')
->whereor(['stav' => ['Rezervováno', 'Objednáno' ]]);
Data z tabulky log bych vypisoval v případě, že by mne zajímalo, kdo všechno měl knihu půjčenou, nebo rezervovanou.
Editoval andros (5. 5. 2018 19:51)
- Koupilsemto
- Člen | 38
Jeejeee úplně jsem se do toho zamotal máš pravdu vůbec to není potřeba a byla by to zbytečnost. Stačí mi nato ->where.
Nevěděl bys ještě prosím jak uložit uložit po kliknutí na tlačítko
jméno přihlášeného? Tak aby se po kliknutí uložilo do ID_users jméno
aktuálně přihlášeného?'.
A jak dát do podminky ->where(aktuálně přihlášený) aktuálně
přilášeného? abych mohl přihlášenému zobrazit pouze log s jeho
jménem?
Po kliknutí na rezervovat se stane:
public function actionRezerve($postId) {
$postId = $this->getParameter('postId');
if ($postId) {
$post = $this->database->table('knihy')->get($postId);
$post->update(['stav' => "Rezervováno",]);
$post = $this->database->query('INSERT INTO log', [
'ID_knihy' => 'test2',
'ID_users' => 'User1',
'akce' => 'Rezervováno',
'date' => new \DateTime()]);}
Pokud ne nevadí moc jsi mi pomohl zkoušel jsem tam hlouposti a přitom to jde udělat normálně.
Editoval Koupilsemto (5. 5. 2018 21:19)
- andros
- Člen | 145
$post = $this->database->query('INSERT INTO log', [
'ID_knihy' => $post->id,
'ID_users' => $this->user->getId(),
'akce' => 'Rezervováno',
'date' => new \DateTime()]);
když už ale používáš Database Explorer (https://doc.nette.org/…ase/explorer), můžeš to zapsat takto:
$data = [
'ID_knihy' => $post->id,
'ID_users' => $this->user->getId(),
'akce' => 'Rezervováno',
'date' => new \DateTime()
];
$this->database->table('log')->insert($data);
jinak 1 řádka metody action je zbytečná:
$postId = $this->getParameter('postId');
$postId už dostáváš jako parametr té metody.
Taky je potřeba si uvědomit, že
if ($postId) {
...
ti kontroluje pouze to, že parametr $postId existuje, resp. že obsahuje nějakou hodnotu. Pokud by parametr $postId obsahoval id knihy které v databázi neexistuje, vyhodí ti to vyjímku.
Celá metoda by tedy mohla vypadat takto:
public function actionReserve($postId) {
$book = $this->database->table('knihy')->get($postId);
if(!$book) {
$this->error('Kniha neexistuje.');
}
$book->update(['stav' => "Rezervováno",]);
$data = [
'ID_knihy' => $book->id,
'ID_users' => $this->user->getId(),
'akce' => 'Rezervováno',
'date' => new \DateTime()
];
$this->database->table('log')->insert($data);
}
No a nakonec pokud se jedná o knihy je lepší místo $post používat $book :) Lépe vystihuje co je v proměnné uloženo. Místo $postid by bylo asi lepší $bookId, nebo jen $id. Pravděpodobně ale rozšiřuješ první aplikaci z návodu https://doc.nette.org/cs/quickstart, kde se používají tyto proměnné.
- Koupilsemto
- Člen | 38
Ano ano :D jde vidět že máš přehled doufám že za par let taky takový budu mít. A moc díky za pomoc zkusím to vytvořit podle toho co jsi napsal.
Editoval Koupilsemto (5. 5. 2018 23:47)