Database Explorer – Where – Více podmínek
- DodiseK
- Člen | 56
Zdravím, snažím se vyřešit jedem problém. Mám ticket systém a rád
bych udělal „Automatické přiřazování“…
Jedna věc je, že první podmínka (Hodnost $rank) nedělá to, co má… no a
ta „podmínka“ ve where mi vyhodí chybu:
if ($rank = 'OWNER') {
$this->template->issues = $this->database->table('issues')
->where('server = ?', 'Technická chyba', 'Žádost o spolupráci')
->order('id DESC')
->limit(1000);
}if ($rank = 'HELPER'){
$this->template->issues = $this->database->table('issues')
->where('server = ?', 'Nahlášení hackera', 'Cross Teaming')
->order('id DESC')
->limit(1000);
}
Tento kód mi vyhodí chybu: Argument count does not match
placeholder count
Nevíte, co s tím?
- Mysteria
- Člen | 797
Máš tam jenom jeden otazník a předáváš další dva parametry, tzn. ten
druhý se nám kam dosadit. Takže pokud má být ta podmínka nebo, tak to
musíš upravit třeba na
->where('server = ? OR server = ?', 'Technická chyba', 'Žádost o spolupráci')
nebo
->where('server IN (?)', ['Technická chyba', 'Žádost o spolupráci'])
.
- DodiseK
- Člen | 56
Celá ta funkce vypadá takto:
public function renderDefault(): void
{
$user = $this->getUser()->getIdentity()->realname;
$rank = $this->database->table('ranksystem')
->where('name = ?', $user)
->fetchField('rank');
if (!$this->getUser()->isLoggedIn()) {
$this->redirect('Sign:in');
}
if ($rank == "ZK.HELPER") {
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "HELPER"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "E.HELPER"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "HL.HELPER"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "HL.BUILDER"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Stížnost na B-Team' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "DEV"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Technická chyba' , 'Návrh na zlepšení' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "VEDENÍ"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Stížnost na B-Team' , 'Technická chyba' , 'Návrh na zlepšení' , 'Problém s VIP' , 'Žádost o spolupráci' , 'Stížnost na Vedení' , 'Jiné'])
->order('id DESC')
->limit(1000);
}if ($rank == "MAJITEL"){
$this->template->issues = $this->database->table('issues')
->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Stížnost na B-Team' , 'Technická chyba' , 'Návrh na zlepšení' , 'Problém s VIP' , 'Žádost o spolupráci' , 'Stížnost na Vedení' , 'Jiné'])
->order('id DESC')
->limit(1000);
}
}
- DodiseK
- Člen | 56
Ještě mě napadá jeden problém.
Rád bych vypsal aktuální rank uživatele, který napsal ticket. Akorát to
nechci vypisovat přímo z databáze.
Asi bude lepší to vysvětlit: Já jsem uživatel, který má hodnost „VIP“
a napíšu ticket.
V ticketu bych rád zobrazoval hodnost toho daného uživatele. Ale nechci, aby
se to zapsalo do databáze po vložení ticketu. Jednoduše jde o to, aby se ta
hodnost v ticketu po změně hodnosti v určité tabulce v databázi obnovila
a nastavila na jeho aktuální hodnost.
Snažil jsem se to vyřešit nějak takto:
Presenter:
$issuename = $this->template->issues = $this->database->table('issues')
->fetchField('autor');
$this->template->userrank = $this->database->table('ranksystem')
->where('name = ?', $issuename);
default.latte:
<span class="badge rank-{foreach $userrank as $ura}{$ura->style} mr-1">{$ura->rank}{/foreach}</span>
Problém je ten, že to nastaví pro všechny ticketu hodnost jednoho uživatele bez ohledu na ostatní.
Editoval DodiseK (25. 3. 2020 0:24)
- Kamil Valenta
- Člen | 822
Ten redirect v renderu asi nebude úplně fungovat dle očekávání. Dej si to třeba do actiony.
Do $issuename ukládáš právě jednoho autora první issue, na kterou
v tabulce issues narazíš. Pominu, že proměnná issuename má zavádějící
jméno. Pak vytáhneš userrank podle jména toho jednoho autora.
Při generování SPANu pak v cyklu zavíráš html tag, takže můžeš
získat něco jako:
<span class="badge rank-style1 mr-1">100style2 mr-1">200</span>
- David Matějka
- Moderator | 6445
ano, muze. spravne primarni a cizi klice jsou pro beh NDB explorer dulezite
- DodiseK
- Člen | 56
Takže v mém případě, mám tabulku ranksystem, ve které mám: id, name, rank, style … a tabulku issues, ve které zase:id ,autor, title, server, content, stav, created_at, prirazen_nick, prirazen_rank, prirazen_style, rank, style… aby to teda fungovalo, musím nastavit primární klíč v tabulce issues pro name v tabulce rank system a autor v tabulce issues ?
- David Matějka
- Moderator | 6445
mít v tabulce primární klíče je vždy důležité. jestli to pak začne fungovat, to nevím – ani si neukázal, co si zkoušel a jak přesně to „nefunguje“
- David Matějka
- Moderator | 6445
pockej, ty do issues ukladas do sloupce „autor“ jmeno autora? tam se ma ukladat ID
- David Matějka
- Moderator | 6445
to si mas vytahnout pres ten cizi klic (pres ref
funkci) z te
druhe tabulky. co kdyz si uzivatel chce zmenit jmeno?
doporucuju na internetu najit nejaky clanek o normalizaci relacni databaze
- DodiseK
- Člen | 56
V databázi jsem připsal podle návodu všechny klíče. Aktuálně mi to
píše chybu: Undefined variable: Context
V presenteru mám toto:
$user_name = $context->table('users')->get(1);
$user_name->ref('users', 'author_id');
V tabulce users mám id, username, realname, password, atd…
V tabulce issues mám id, autor_id, atd…
No a já potřebuji vytahnout z tabulky users realname, který bych chtěl dát
do proměnné $user_rank…
- Šaman
- Člen | 2667
DodiseK Prosím tě, víš aspoň trochu co vlastně
děláš? Nebo jenom slepuješ náhodné kusy kódu napříč dokumentací a
fórem?
Ten $context
je tvoje připojení k databázi. V presenteru
nejspíš $this->database
, ale pojmenované to může
být jinak.
Mám z těch dotazů pocit, že plaveš v základech php, relačních
databází a neprojel sis základy Nette a ptáš se proč ti kód
nefunguje.
Jinak kdybys byl třeba z jiných jazyků zvyklý pracovat s databází
nízkoúrovňově, tak můžeš používat metodu query()
a dotazy
si psát ručně. Nette zápis je fajn, ale je to určitá nadstavba která má
svá pravidla, takže zase něco nového.