Kombinovaný filtr výběru z databáze
- gizer
- Člen | 67
Dobrý den,
rád bych udělal kombinovaný filtr výběru z databáze, který by vybral
buď skupinu uživatelů nebo pouze jednoho uživatele dle id.
V kódu bych se to dalo zapsat dvěma dotazy. Oba samostatně fungují.
// vrátí všechny záznamy jako pole
$rows = $database->fetchAll('SELECT * FROM users');
// vrátí jeden záznam
$row = $database->fetch('SELECT * FROM users WHERE id = ?', $id);
Otázka tedy zní? Jak kombinovat oba dotazy, aby mně vyhledávací formulář umožnil obojí. Vyhledávat jak skupinu uživatelů, tak i vybraného uživatele.
Děkuji moc za každou radu.
- Michal Kumžák
- Člen | 106
rád bych udělal kombinovaný filtr výběru z databáze, který by vybral buď skupinu uživatelů nebo pouze jednoho uživatele dle id.
A podle čeho bude vybírat tu skupinu? A ten vyhledávací formulář má jedno pole, nebo více? Podle mě si budeš muset napsat komplexnější SQL dotaz.
- SankaCoffee
- Člen | 8
Toto by nestačilo?
if (empty($id) {
// vrátí všechny záznamy jako pole
$rows = $database->fetchAll('SELECT * FROM users');
} else {
// vrátí záznam dle ID jako pole
$rows = $database->fetchAll('SELECT * FROM users WHERE id = ?', $id);
}
Je to jen nástřel. Zřejmě budeš muset inicializovat $id. Pokud to vykresluješ do tabulky přes foreach, bude pro tebe lepší volat fetchAll i pro získání jednoho záznamu uživatele. Pak nebudeš muset při vykreslování řešit, jestli máš pole záznamů nebo jen jeden.
- Marek Znojil
- Člen | 90
Já to třeba řeším tak, že téměř každá metoda dao třídy mi vrací selection.
final class UserDao{
private Explorer $explorer;
public function __construct(Explorer $explorer){
$this->explorer = $explorer;
}
public function findAllUsers(): Selection{
return $this->explorer->table('user')->select('*');
}
}
a pak si použiji dle libosti, například v presenteru:
final class UserPresenter extends \Nette\Application\UI\Presenter{
private UserDao $userDao;
public function __construct(UserDao $userDao){
$this->userDao = $userDao;
}
public function actionDefault(?int $id = null): void{
$allUsers = $this->userDao->findAllUsers();
if($id !== null){
$user = $allUsers->get($id);
}
}
}
Hlavní myšlenka je v tom, že základ dotazu máš připravený a díky třídě selection si jej můžeš dle potřeby upravit, například: stránkování, filtrování, apod.
- Kamil Valenta
- Člen | 822
Marek Znojil napsal(a):
Hlavní myšlenka je v tom, že základ dotazu máš připravený a díky třídě selection si jej můžeš dle potřeby upravit, například: stránkování, filtrování, apod.
Což je sice pohodlné, ale ne zrovna moc zapouzdřené.