Database explorer – výběr dvou záznamů z jedné tabulky
- Allconius
- Člen | 317
Ahoj,
potřeboval bych upravit tento dotaz:
<?php
$result = $this->database->table($this->tabulka)
->where(''.$this->tabulka.'.Smazano = ?', 0)
->where(''.$this->tabulka.'.Rok LIKE ?', $rok)
->where(''.$this->tabulka.'.Cislo LIKE ?', $cislo)
->where(''.$this->tabulka.'.A_Osoba LIKE ?', $zpracovatel)
->where(':'.$this->tabulka.'(StpID):'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
->where(':'.$this->tabulka.'(StpuID):'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)
->where(''.$this->tabulkaa.'.Adresa LIKE ?', $adresa)
->order(''.$this->tabulka.'.ID DESC');
?>
Potřeboval bych aby to hledalo v $this->tabulka ve sloupci StpID i StpuID, které oba obsahují cizí klíče do tabulky $this->tabulkap , našel jsem nějaký příklad s dvojtečkama:
<?php
$authors = $context->table('author');
$authors->where(':book:book_tags.tag.name', 'PHP')
->group('author.id')
->having('COUNT(:book:book_tags.tag.id) > 0');
?>
ale nevím zda se to dá použít i na můj případ …
- David Matějka
- Moderator | 6445
dvojtecka se pouziva pri „has many“ smeru. v tvem pripade ta tabulka drzi ID, takze se jedna o „has one“ pristup a to je ten example v dokumentaci nad tim s dvojteckou:
$books = $context->table('book');
$books->where('author.name LIKE ?', '%Jon%');
$books->where('translator.name', 'David Grudl');
- Allconius
- Člen | 317
David Matějka napsal(a):
dvojtecka se pouziva pri „has many“ smeru. v tvem pripade ta tabulka drzi ID, takze se jedna o „has one“ pristup a to je ten example v dokumentaci nad tim s dvojteckou:
$books = $context->table('book'); $books->where('author.name LIKE ?', '%Jon%'); $books->where('translator.name', 'David Grudl');
ale když tam dám:
<?php
$result = $this->database->table($this->tabulka)
->where(''.$this->tabulka.'.Smazano = ?', 0)
->where(''.$this->tabulka.'.Rok LIKE ?', $rok)
->where(''.$this->tabulka.'.Cislo LIKE ?', $cislo)
->where(''.$this->tabulka.'.A_Osoba LIKE ?', $zpracovatel)
->where(''.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
->where(''.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)
->where(''.$this->tabulkaa.'.Adresa LIKE ?', $adresa)
->order(''.$this->tabulka.'.ID DESC');
?>
tak mi to vytvoří dotaz:
<?php
SELECT `St`.ID
FROM `St`
LEFT JOIN `Stp` ON `St`.`StpID` = `Stp`.`StpID`
LEFT JOIN `Sta` ON `St`.`StaID` = `Sta`.`StaID`
WHERE (`St`.`Smazano` = 0) AND (`St`.`Rok` LIKE $rok) AND (`St`.`Cislo` LIKE '%%') AND (`St`.`A_Osoba`
LIKE '%') AND (`Stp`.`Prijmeni` LIKE $primeni) AND (`Stp`.`Prijmeni` LIKE $primeni1) AND (`Sta`.`Adresa` LIKE '%')
ORDER BY `St`.ID DESC
?>
ale já bych z toho potřeboval dostat něco takového:
<?php
SELECT `St`.ID
FROM `St`
LEFT JOIN `Stp` ON `St`.`StpID` = `Stp`.`StpID`
LEFT JOIN `Stp` ON `St`.`StpuID` = `Stp`.`StpID`
LEFT JOIN `Sta` ON `St`.`StaID` = `Sta`.`StaID`
WHERE (`St`.`Smazano` = 0) AND (`St`.`Rok` LIKE $rok) AND (`St`.`Cislo` LIKE '%%') AND (`St`.`A_Osoba`
LIKE '%') AND (`Stp`.`Prijmeni` LIKE $primeni) AND (`Stp`.`Prijmeni` LIKE $primeni1) AND (`Sta`.`Adresa` LIKE '%')
ORDER BY `St`.ID DESC
?>
a nějak mu říct aby $prijmeni hledal v StpID a $primeni1 v StpuID. Takhle jak to mám tak hledá $primeni i $primeni1 v StpID
- David Matějka
- Moderator | 6445
pro spojovaci klic se pouziva nazev sloupecku s FK, tedy v tvem pripade
Stp.Prijmeni
a Stpu.Prijmeni
mimochodem, doporucuju pouzivat smysluplny pojmenovani
- Allconius
- Člen | 317
David Matějka napsal(a):
pro spojovaci klic se pouziva nazev sloupecku s FK, tedy v tvem pripade
Stp.Prijmeni
aStpu.Prijmeni
mimochodem, doporucuju pouzivat smysluplny pojmenovani
Ahoj, akorát právě nevím jak je ta syntaxe ?
<?php
->where('Stp.'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
->where('Stpu.'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)
?>
?
- Allconius
- Člen | 317
asi něco takového:
<?php
$this->database->table('boards')
->whereOr([
'position1_id.player_id.name LIKE ?' => '%jmeno%',
'position1_id.player_id.surname LIKE ?' => '%jmeno%',
'position2_id.player_id.name LIKE ?' => '%jmeno%',
'position2_id.player_id.surname LIKE ?' => '%jmeno%'
]);
?>
s těma podtržítkama, ale když dám:
<?php
->where(''.$this->tabulka.'_StpID.'.$this->tabulkap.'_Prijmeni LIKE ?', $prijmeni)
->where(''.$this->tabulka.'_StpuID.'.$this->tabulkap.'_Prijmeni LIKE ?', $prijm
?>
tak to hodí chybu:
Nette\InvalidArgumentException
No reference found for $St->St_StpID.
- David Matějka
- Moderator | 6445
Ahoj, akorát právě nevím jak je ta syntaxe ?
ta syntaxe je takova, jakou jsem zminoval Stp.Prijmeni
a
Stpu.Prijmeni
(tedy pokud jsem se neztratil v tech nesmyslnych
nazvech tabulek)
- Allconius
- Člen | 317
David Matějka napsal(a):
Ahoj, akorát právě nevím jak je ta syntaxe ?
ta syntaxe je takova, jakou jsem zminoval
Stp.Prijmeni
aStpu.Prijmeni
(tedy pokud jsem se neztratil v tech nesmyslnych nazvech tabulek)
Ahoj ztratil :-) Protože tabulka Stpu neexistuje existuji prave jen
2 tabulky:
St:
ID, StpID, StpuID
1, 1, 2
a tabulka Stp:
StpID, Prijmeni
1, Novák
2, Jelen
a já potřebuju udělat dotaz: Najdi mi z tabulky St vsechny zaznamy kde je StpID Novák a StpuID Jelen
- David Matějka
- Moderator | 6445
https://doc.nette.org/…ase/explorer#…
Řekněme, že chceme vybrat všechny knihy, které napsal autor jménem Jon. Musíme napsat pouze jméno spojovacího klíče relace a název sloupce spojené tabulky. Spojovací klíč je odvozen od jména sloupce, který odkazuje na tabulku, se kterou se chceme spojit. V našem příkladu (viz databázové schéma) je to sloupec author_id, ze kterého -stačí použít část – author.
- Allconius
- Člen | 317
David Matějka napsal(a):
https://doc.nette.org/…ase/explorer#…
Řekněme, že chceme vybrat všechny knihy, které napsal autor jménem Jon. Musíme napsat pouze jméno spojovacího klíče relace a název sloupce spojené tabulky. Spojovací klíč je odvozen od jména sloupce, který odkazuje na tabulku, se kterou se chceme spojit. V našem příkladu (viz databázové schéma) je to sloupec author_id, ze kterého -stačí použít část – author.
Ahoj, už jsem to konečně pochopil, nevěděl jsem že to jde zapsat i zkráceně , ale fungují oboje verze:
<?php
->where('StpID.Prijmeni LIKE ?', $prijmeni)
->where('StpuID.Prijmeni LIKE ?', $prijmeni1)
->where('Stp.Prijmeni LIKE ?', $prijmeni)
->where('Stpu.Prijmeni LIKE ?', $prijmeni1)
?>
děkuji moc, promiň že jsem tě s tím tak zdržel, jsem občas natvrdlej …