Przemysław Godlewski

Przemysław Godlewski Own company/PHP
programmer/Web
Developer

Temat: setParameter w repositories

hey, czuy ktos wie dlaczego symfony nie zmienia mi zmiennej 'menuname' w zapytaniu ponizej?

class MenuRepository extends EntityRepository
{

public function getMenuIdByName($menuName)
{

$qb = $this->createQueryBuilder('m')
->select('m.id')
->where('m.name = :menuname')->setParameter('menuname', $menuName);

return $qb->getQuery()
->getResult();
}
}

jak zrobie $qb->getlDQL() to dalej mam w zapytaniu ':menuname' zamiast przekazanej wartosci, jakby setParameter() nie dzialalo.

konto usunięte

Temat: setParameter w repositories

Dokładnie tak działają tzw. prepared statements, które są używane "pod maską".
W dużym skrócie mówiąc wykonanie takiego zapytania odbywa się w dwóch krokach:

1) przygotowanie szablonu zapytania - nie zawiera on jeszcze na tym etapie konkretnych wartości, a jedynie parametry (tzw. placeholdery, w miejsce których później zostaną podstawione wartości). Taki szablon jest optymalizowany i cache'owany przez bazę danych.
2) właściwe wykonanie zapytania - do uprzednio przygotowanego szablonu podstawiane są w odpowiednich miejscach konkretne wartości parametrów, następuje wykonanie zapytania oraz zwrócenie wyników.

Co ważne faktyczne podstawienie wartości pod konkretne parametry ma miejsce już po stronie bazy danych a nie po stronie aplikacji. Dlatego właśnie metoda getDQL() zwraca szablon z parametrami a nie "wynikowe" zapytanie.

Więcej na temat tego jak to działa możesz przeczytać tutaj:
http://php.net/manual/en/pdo.prepared-statements.php

W razie gdyby coś jeszcze było dla Ciebie niejasne - pisz.

Pozdrawiam,
Sebastian Kremiec



Wyślij zaproszenie do