Problema Select con Doctrine e Postgresql (Symfony 3)

9 views
Skip to first unread message

Alessandro Giulianelli

unread,
Jan 16, 2018, 3:40:15 PM1/16/18
to PUG Roma
Ciao a tutti,

oggi mi è uscito un problema piuttosto strano e sul quale non so che pesci prendere....

Ho questa funzione che non fa altro che una semplice query su un db postgresql...

/**
* @Route("/api/find/{intent}/{lang}/", name="find_intent")
*/
public function find_intent($intent, $lang='EN')
{
$this->get('logger')->info('ApiController::find_intent' );
$em = $this->get('doctrine')->getManager();
$query = $em->createQuery(
'SELECT distinct i.intent
    FROM AppBundle:Intent i
    WHERE i.intent like :intent and i.lang = :lang
    ORDER BY i.intent ASC'
)->setParameter('intent', '%' . $intent . '%')
->setParameter('lang', $lang);

$intents = $query->getResult();
$intents_array = array();
for ($i = 0; $i < count($intents); $i++) {
$intents_array[] = trim( $intents[$i]['intent'] ); 
}
return new JsonResponse(
array(
'intent_list' => $intents_array,
'status' => 200
));
}

Il problema è che ha sempre funzionato tranne in un caso specifico: $intent = "intent_en_"; se l'utente digita "intent_english_", la query funziona....

Ho letto che la coppia LIKE e underscore assume una funzione di pattern matching...cosa che io ovviamente non voglio...

Vi chiedo: come posso risolvere? C'è una qualche funzione che mi permetta di fare l'escape prima di darlo in pasto a doctrine????

Grazie a tutti per l'aiuto,
Alex



Francesco Face

unread,
Jan 24, 2018, 4:02:09 AM1/24/18
to pug-...@googlegroups.com
Dalla guida di Postgres SQL:

To match a literal underscore or percent sign without matching other characters, the respective character in pattern must be preceded by the escape character. The default escape character is the backslash but a different one can be selected by using the ESCAPE clause. To match the escape character itself, write two escape characters.


Però ti do un altro paio di consigli. In primis, avere una query direttamente nella action in cui restituisci risultati porta facilmente ad avere presto codice molto confuso, in cui si fanno "tante cose insieme nello stesso posto". Parole chiave da cercare su internet: "repository pattern" e "single responsibility principle"

In secundis, la mailing list del PUG continua ad esistere per motivi storici, ma le conversazioni si sono ormai spostate principalmente sul canale slack del Grusp, ti consiglio di iscriverti qui: https://slack-grusp.herokuapp.com/ per avere conversazioni più immediate.

Ciao,
Francesco

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "PUG Roma" di Google Gruppi.
Visita questo gruppo all'indirizzo https://groups.google.com/group/pug-roma.

Reply all
Reply to author
Forward
0 new messages