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)