Select where+and+or při použití ID

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

Dobrý den, omlouvám se že zase píší ale mám problém sestavit tento dotaz se kterým se trápím okolo 3 hodin. Nejspíše někde dělám špatně čárku nebo závorku.
SELECT * FROM log WHERE ID_users =‚9‘ AND akce =‚Připravena k vyzvednutí‘ OR ID_users =‚9‘ AND akce =‚Rezervováno‘

Podařilo se mi vytvořit… to je však spatně.

    public function renderStavobjednavka($strana = 1) {
        $this->template->strana = $strana;
        $this->template->log = $this->database->table('log')
                ->where($this->user->getId())
                ->where('akce = ? OR akce = ?','Připravena k vyzvednutí', 'Rezervováno')
                ->page($strana, 20)
                ->order('akce ASC');
    }

Nažím se vytvořit neco jako ->where($this->user->getId() AND ‚akce = ?,'Připravena k vyzvednutí‘ OR ‚ID_users = ?‘,‚9‘ AND ‚akce = ?,'Rezervováno‘) a podle dokumentace se mi to moc nedaří :(

Editoval Koupilsemto (7. 5. 2018 18:07)

kiCkZ
Člen | 153
+
0
-

Začal bych první chybou a to je pracovat s databází v presenteru, tato vrstva by měla být oddělena v modelu.

Následně bys mohl tento dotaz udělat takto:

$this->database->table('log')->where('user_id', $userId)->where('akce ? OR akce ?','Připravena k vyzvednutí', 'Rezervováno')->page($strana, 20)->order('akce');
Koupilsemto
Člen | 38
+
0
-

Díky za reakci a tu práci s databázi se pokusím předělat. Bohužel ten dotaz je něco jiného než bych potřeboval:
SELECT * FROM log WHERE ID_users =‚9‘ AND akce =‚Připravena k vyzvednutí‘ OR akce =‚Rezervováno‘; tohle skončí tak že to najde ID kde je Pripravené… nebo vše kde je Rezervováno. Potřebuji najdi ID kde je 9 a akce je Rezervovano NEBO kde je ID 9 a akce Pripraveno.

Editoval Koupilsemto (7. 5. 2018 18:48)

CZechBoY
Člen | 3608
+
0
-

V uvodnim prispevku zkus zanorit druhy (se stavy) where do závorek.

kiCkZ
Člen | 153
+
0
-

Koupilsemto napsal(a):

Díky za reakci a tu práci s databázi se pokusím předělat. Bohužel ten dotaz je něco jiného než bych potřeboval:
SELECT * FROM log WHERE ID_users =‚9‘ AND akce =‚Připravena k vyzvednutí‘ OR akce =‚Rezervováno‘; tohle skončí tak že to najde ID kde je Pripravené… nebo vše kde je Rezervováno. Potřebuji najdi ID kde je 9 a akce je Rezervovano NEBO kde je ID 9 a akce Pripraveno.

Pokud jsem to pochopil správně, tak chceš dotaz, kde je jasně dané user_id = 9 ?

$this->database->table('log')->where('user_id', 9)->where('akce', ['Připravena k vyzvednutí', 'Rezervováno'])->page($strana, 20)->order('akce');

Editoval kiCkZ (7. 5. 2018 19:07)

Koupilsemto
Člen | 38
+
0
-

Jo jo chápeš dobře ale místo ID 9(bylo jen jako příklad) potřebují zobrazovat pro aktuálně přihlášeného pomocí
($this->user->getId()) a to se mi nedaří. A pokud fungují podmínky že chci Rezervované nebo připravené tak mi nejde podmínka aby to byla aktuálně přihlášená ID

Editoval Koupilsemto (7. 5. 2018 19:19)

kiCkZ
Člen | 153
+
+1
-

Koupilsemto napsal(a):

Jo jo chápeš dobře ale místo ID 9(bylo jen jako příklad) potřebují zobrazovat pro aktuálně přihlášeného pomocí
($this->user->getId()) a to se mi nedaří

Právě proto si vytvoř model, ve kterém napíšeš metodu na vytáhnutí dat z DB a jako parametr budeš předávat to ID aktuálně přihlášeného uživatele, proto jsem ti ten první dotaz psal s proměnnou $userId.

public function nazev_funkce($userId) // zde máš předávat ID aktuálně přihlášeného uživatele
{
	return $this->database->table('log')->where('user_id', $userId)->where('akce', ['Připravena k vyzvednutí', 'Rezervováno'])->page($strana, 20)->order('akce');
}

Editoval kiCkZ (7. 5. 2018 19:23)

Koupilsemto
Člen | 38
+
0
-

Promin jsem amatér. Bohužel nevím jak předat ID aktuálně přihlášeného do $userId ale s $userId=‚neco‘ funguji podmínky na 100%.

kiCkZ
Člen | 153
+
+2
-

Koupilsemto napsal(a):

Promin jsem amatér. Bohužel nevím jak předat ID aktuálně přihlášeného do $userId ale s $userId=‚neco‘ funguji podmínky na 100%.

V pořádku i já jsem dost začátečník, nicméně postupně se určitě dostaneš dál.

Mrkni se na tento příklad: https://forum.nette.org/…senterom-atd#…

A v tomto příkladu máš presenter a metodu, která předaná data zobrazí (render):

    public function renderDefault() {
        $this->template->data = $this->model->mojeMetoda($this->user->id); // zde předáš ID
    }

A poté v modelu (MujModel), kde je metoda (mojeMetoda) nastavíš, aby funkce přijala nějaký parametr

public function mojeMetoda($userId) {
       return $this->database->table('log')->where('user_id', $userId)->where('akce', ['Připravena k vyzvednutí', 'Rezervováno'])->page($strana, 20)->order('akce');
}

Pokud nemáš žádné zkušenosti s tím, jak nastavit parametr do metod, tak bych spíše začal základy a poté přešel na OOP a až následně na framework, aby si aspoň tušil, jakým způsobem se dá s PHP pracovat.

Editoval kiCkZ (7. 5. 2018 20:36)

Koupilsemto
Člen | 38
+
0
-

Tak to je bomba!!! ani nevíš jak jsi mi pomohl a konečně mi pár věcí došlo :D moc díky za trpělivost. Dám sem ukázku třeba někomu také pomůže + popis.

  1. Zalozit MujModel.php v app/model a vytvořit metodu
<?php
class MujModel {
    public $database;
	public function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}
    public function mojeMetoda($userId) {
        return $this->database->table('log')
                ->where('ID_users', $userId)
                ->where('akce', ['Připravena k vyzvednutí', 'Rezervováno'])
                ->order('akce');}}
  1. Přidat model do service v config.neon jinak skončí chybou model not found
services:
	- MujModel
  1. Vytvoritořit v presenteru (v mém případě) KnihyinfoPresenter.php renderování a přidat public $model; pred metodu render jinak skonči chybou Cannot read an undeclared property
class KnihyinfoPresenter extends Nette\Application\UI\Presenter {
	public $model;
    public function renderStavobjednavka() {
        $this->template->log = $this->model->mojeMetoda($this->user->id);
}
  1. a pak samozřejmě latte…

Je docela možné že to není 100% jak by mělo být proto to berte jako inspiraci jelikož jsem amater. Ale funguje to!
A moc díky KiCkZ i CzechBoy za pomoc jsem o něco chytřejší.

Editoval Koupilsemto (8. 5. 2018 0:39)