# Request A request egy egyszerűsítő API-t kínál az Access réteg fölé, ahol már nem írunk kézzel SQL-eket. Talán egy példán keresztül értheted meg a legjobban a lényegét. ```php // létrehozzuk a requestet, ami megkapja a hozzáférést $request = new Request($access); $users = $request ->select('*') // minden mezőt lekérdezünk ->from('user') // a user táblából ->where(Filter::where('age>$1',18)) // aki idősebb, mint 18 ->asc('name') // név szerint sorbarendezve ->collect(10,50); // 10 darabot kérünk az 50.-től ``` ```sql SELECT * FROM `user` WHERE age>'18' ORDER BY `name` ASC LIMIT 10 OFFSET 50 ``` ## Konstruktor ##### `__construct(Access $access, \Closure $converter = null) ` A konstruktorban meg kell adnod a kapcsolatot ($access), amit a Request használni fog. Opcionális paraméterként megadhatsz egy függvényt ($converter), ami konvertálja a visszakapott értékeket. Bonyolultnak tünhet a konstruktor szignatúra, de Phlexben a Request objektumokat a legtöbb esetben már készen, felparaméterezve fogod megkapni. ## Konverter ##### `setConverter(\Closure $converter = null):Request` Megadhatsz egy konvertert a Requestedhez. Ha null paramétert adsz át, akkor törlöd a konvertert. A konverter feladata, hogy módosítson minden egyes sort, amit a requested visszaad. Például az alábbi konvertert megadva MyClass objektumokat kapsz vissza a lekérdezésed végén, amik a rekordokkal lesznek példányosítva. ```php $request->setConverter( function ($record){ return new MyClass($record); } ); ``` ## Asszociatív lekérdezés ##### `key(string $key):Request` Amennyiben a lekérdezés egyik oszlopát szeretnéd, hogy a kulcsa legyen a visszakapott rekordok tömbjének, akkor azt ebben a metódusban adhatod meg. ## SELECT ? ##### `select(string $sql, ...$sqlParams):Request` Itt adhatod meg, hogy mely mezőket szeretnéd lekérdezni. ## FROM ? ##### `from(string $sql, ...$sqlParams):Request` Itt adhatod meg, hogy honnan történjen a lekérdezés, tipikusan egy tábla nevével szoktuk paraméterezni. ## WHERE ? ##### `where(Filter $filter = null):Request` Itt megadhatsz egy filtert, ami a keresési feltételeket tartalmazza. ## ORDER BY ? ##### `asc($field):Request` ##### `desc($field):Request` Növekvő és csökkenő rendezés a megadott mező alapján. --- ##### `ascIf($condition, $field):Request` ##### `descIf($condition, $field):Request` Amennyiben a **$condition** értéke igaz, akkor fűzi csak hozzá a sorbarendezést. --- ##### `order($order):Request` ##### `orderIf($condition, $order):Request` Az **order** és az **orderIf** közötti különbség pont annyi, mint pár sorral feljebb, mondjuk az **and** és az **andIf** között. Az **$order** argumentum viszont érdekesebb, ugyanis ez két tipusú paramétert fogadhat: * string esetében a megadott stringet írja az "ORDER BY" mögé * tömb esetében viszont egy rendezési rendszert is megadhatsz. A tömb kulcsai a mezők, az értékük ASC és DESC lehet a rendezés irányától függően. --- Az fenti sorrendezést szabályozó metódusokat meghívva azok egymásra épülnek. Az alábbi példa bemutatja: ```php $request->desc('height')->asc('age')->asc('name'); ``` ```sql ... ORDER BY `height` DESC,`age` ASC, `name` ASC ... ``` ## SQL ##### `getSql():string` Visszaadja az SQL-t, amit a request objektum reprezentál. ## Lekérdezések ##### `count():int`` Egyszerűsíti a lekérdezésed és csak az annak megfelelő sorok számával tér vissza. --- ##### `pick()` Egyetlen egy sor lekérdezése. Ha nincs találat, akkor null-al tér vissza. --- ##### `collect($limit=null, $offset=null)`` Több sor lekérdezése. Megadhatdo, hogy hány sort és milyen offsettel szeretnél lekérdezni. Ha nincs találat, akkor egy üres tömbbel tér vissza. --- ##### `collectPage($pageSize, $page, &$count)` Ha lapozásos lekérdezést szeretnél használni, ezt a metódust kell használnod. Megadhatod, hogy hány elemet szeretnél látni egy lapon, hányadik lapot szeretnéd lekérdezni és egy cím szerint átvett változóba azt is visszakapod, hogy hány elem van összesen, hogy a lapozó interface-edet könnyen fel tudd építeni. --- ##### `collectData($limit = null, $offset = null)` ##### `collectPageData($pageSize, $page, &$count)` Ez a két metódus nagyon hasonlít a fenti collect, collectPage metódusokra. Igazából a motorháztető alatt a fentiek is ezeket használják a lekérdezéshez - azzal a különbséggel, hogy ezek nem használják a megadott konvertert.