Passare il parser al selezionatore o passare il sorter al parser?

1

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

    
posta php_nub_qq 24.07.2016 - 11:11
fonte

1 risposta

3

Non farei nessuno dei due. Non c'è motivo per nessuna delle due classi di sapere dell'altro.

Vorrei usare una terza classe che orchestra questo lavoro. Chiamalo qualcosa come SQLExecutor.

Avrei un metodo come RunQuery (query, sorter). Potrebbe quindi essere esteso ad altri metodi che utilizzano diversi tipi di ordinamento o analisi.

Questo lascia la responsabilità per ogni pezzo di lavoro distinto in classi distinte.

    
risposta data 03.08.2016 - 19:04
fonte

Leggi altre domande sui tag