Ho 2 oggetti che non sono molto sicuro di quale sia il modo corretto (o migliore) che dovrei usare.
Ho un oggetto builder di query che costruisce un'istruzione SQL come
$qb = new SelectQuery('users');
$qb->columns('id', 'email')->where('id', '=', 25);
print_r($qb->build());
print_r($qb->data());
Output
SELECT id,email FROM users WHERE id = :a
Array
(
[:a] => 25
)
Quindi posso passarlo a PDO::prepare()
e PDOStatement::execute()
e ottenere elementi in corso.
L'altra classe che ho è una specie di selezionatore che non so davvero come chiamarla. Accetta un gruppo di parametri e costruisce alcuni SQL che ordinano e / o limitano la query che sta per essere eseguita nella pagina.
$parser = new SQLGridParser([
'query' => 'foo',
'sort' => 'id-0'
]);
$parser->setSearchColumns(['email']);
print_r($parser->getFilters());
print_r($parser->getOrderBy());
Output
Array
(
[0] => AND 'email' LIKE :b
[1] => Array
(
[:b] => %foo%
)
)
ORDER BY 'id' DESC
Ora voglio essere in grado di passare un oggetto all'altro e avere una query completa costruita alla fine, ma ho i miei dubbi su quale oggetto dovrei passare a cui.
Se passo il parser / sorter al generatore di query, la funzione sarà simile a
public function useSorter(SQLGridParser $parser) {
$filters = $parser->getFilters();
$this->where .= $filters[0];
$this->data = array_merge($this->data, $filters[1]);
$this->order = $parser->getOrderBy();
// and so on..
}
Se passo il builder al selezionatore, allora sarebbe qualcosa di simile a questo
public function injectSQL(Query $query) {
$filters = $this->getFilters();
$query->where .= $filters[0];
$query->data = array_merge($query->data, $filters[1]);
$query->order = $this->getOrderBy();
// and so on...
}
Il codice è sostanzialmente identico, ma quale sarebbe la soluzione migliore e perché?