Join dat z 2 tabulky s podminkou na joinuté ->where()

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

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!

andros
Člen | 145
+
0
-

Pokud máš sloupec stav v tabulce knihy, musíš položit dotaz takto:

$this->template->log = $this->database->table('log')
        ->where('knihy.stav', 'Rezervováno')
Koupilsemto
Člen | 38
+
0
-

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
+
+1
-

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

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
+
+2
-
$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
+
0
-

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)