Kombinovaný filtr výběru z databáze

gizer
Člen | 67
+
0
-

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

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.

gizer
Člen | 67
+
0
-

Celý problém jsem zjednodušil. Vybírat bude v prvním případě prostě všechny uživatele v tabulce. Ve druhém pak jednoho konkrétního dle id.

SankaCoffee
Člen | 8
+
0
-

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

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

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é.

gizer
Člen | 67
+
0
-

Děkuji moc všem za náměty a půjdu to otestovat.